SSH 指令:-l、-p、-i 選項用法與連線錯誤確認
SSH 指令是 OpenSSH 用戶端的指令,以 ssh 帳號@伺服器位址的形式透過加密連線登入遠端 Linux 伺服器,並在連上的伺服器上執行指令。我們從 AlmaLinux 9 伺服器對 Debian 12 伺服器執行 ssh,依序確認了首次連線的主機金鑰檢查、-l、-p、-i 選項、遠端指令執行,以及 -v 的除錯輸出。結果發現,選項實際上如何套用,不必連線就能先用 ssh -G 確認。
下方輸出是兩台伺服器上執行的原始結果。伺服器位址與帳號、主機名稱、金鑰路徑與金鑰指紋,以及發起連線伺服器的 OpenSSL、核心版本號碼,都已換成範例值。發起連線的 AlmaLinux 伺服器使用 root 帳號,接受連線的 Debian 伺服器使用一般帳號。
1️⃣ SSH 指令基本用法
登入遠端伺服器時,在 ssh 後面寫上帳號名稱與伺服器位址,中間以 @ 連接。登入後提示字元會變成連上那台伺服器的提示字元,輸入 exit 就會中斷連線並回到原本的伺服器。
ssh user@192.0.2.10Linux server2 6.1.0-53-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.187-1 (2026-09-07) x86_64
Last login: Wed Oct 28 20:27:41 2026 from 198.51.100.7
[user]:~$ whoami
user
[user]:~$ exit
exit
Connection to 192.0.2.10 closed.連上的 Debian 伺服器在登入時還多顯示了幾行伺服器公告(motd)與郵件通知,上方輸出只省略了這幾行。
第一次連線的伺服器,會在登入前顯示伺服器的主機金鑰指紋,並詢問是否繼續連線。輸入 yes 後,主機金鑰存進了 ~/.ssh/known_hosts,接著出現 whoami 的結果。
ssh user@192.0.2.10 whoamiThe authenticity of host '192.0.2.10 (192.0.2.10)' can't be established.
ED25519 key fingerprint is SHA256:9fT2kL0qX8vN4cR1yB6sW3mZ7aH5dE0uJ2pG8oK1iVc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.0.2.10' (ED25519) to the list of known hosts.
user存進 known_hosts 之後,再連同一台伺服器就不再出現這個詢問。如果指紋與伺服器管理員提供的值不同,就輸入 no。輸入 no 後,ssh 沒有連線就結束了。
ssh user@192.0.2.10The authenticity of host '192.0.2.10 (192.0.2.10)' can't be established.
ED25519 key fingerprint is SHA256:9fT2kL0qX8vN4cR1yB6sW3mZ7aH5dE0uJ2pG8oK1iVc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? no
Host key verification failed.以 no 結束時,known_hosts 檔案並沒有建立。所以下次連線時還會再出現同樣的詢問。
2️⃣ SSH 指令選項
ssh 的選項寫在連線目標之前。只執行 ssh 時,可用選項的清單會以用法說明的形式顯示。
sshusage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address]
[-c cipher_spec] [-D [bind_address:]port] [-E log_file]
[-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file]
[-J destination] [-L address] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-P tag] [-p port] [-R address]
[-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
destination [command [argument ...]]
ssh [-Q query_option]如果加上用法說明裡沒有的選項,會出現 [unknown option] 錯誤,並再次顯示同樣的用法說明。
-V 會輸出已安裝的 OpenSSH 用戶端版本。下方是發起連線的 AlmaLinux 伺服器的結果,接受連線的 Debian 12 伺服器則顯示 OpenSSH_9.2p1。
ssh -VOpenSSH_9.9p1, OpenSSL 3.5.1 1 Jul 2025-G 不會連線到伺服器,而是把指定的選項與設定檔合併,輸出實際會套用的值。完整輸出有 87 行,所以用 grep 只挑出需要的行。
ssh -G user@example.com | grep -E "^(user|hostname|port|identityfile|connecttimeout|stricthostkeychecking|serveraliveinterval) "user user
hostname example.com
port 22
stricthostkeychecking ask
serveraliveinterval 0
identityfile ~/.ssh/id_rsa
identityfile ~/.ssh/id_ecdsa
identityfile ~/.ssh/id_ecdsa_sk
identityfile ~/.ssh/id_ed25519
identityfile ~/.ssh/id_ed25519_sk
identityfile ~/.ssh/id_xmss
identityfile ~/.ssh/id_dsa
connecttimeout noneidentityfile 這七行,是沒有指定 -i 時 ssh 依序尋找的預設金鑰檔案。connecttimeout none 表示沒有另外設定連線等待時間。
| 選項 | 複製 | 說明 |
|---|---|---|
| -l帳號 | 指定連線用的帳號名稱 | |
| -p連接埠 | 指定連線的連接埠(預設 22) | |
| -i金鑰檔案 | 指定私密金鑰檔案 | |
| -v | 以 debug1 行輸出連線過程 | |
| -C | 壓縮收送的資料 | |
| -X | X11 轉發(遠端 GUI 程式) | |
| -T | 不配置虛擬終端機 | |
| -t | 強制配置虛擬終端機 | |
| -n | 將標準輸入改為 /dev/null | |
| -q | 減少警告與提示訊息 | |
| -o項目=值 | 只對這次連線指定設定檔項目 | |
| -L | 本機連接埠轉發 | |
| -F | 指定設定檔 | |
| -G | 不連線,輸出會套用的設定 | |
| -V | 輸出 OpenSSH 用戶端版本 |
| 選項 | 複製 | 說明 |
|---|---|---|
| -N | 不執行遠端指令,只維持連線 | |
| -J | 經由另一台伺服器連線 |
3️⃣ ssh -l 選項與 -L 連接埠轉發
-l 是指定連線帳號名稱的選項。ssh -l user 192.0.2.10 與 ssh user@192.0.2.10 以同一個帳號連線。
ssh -l user 192.0.2.10 whoamiuser用 -G 確認後,以 -l 指定的帳號填進了 user 項目。
ssh -G -l admin example.com | grep -E "^(user|hostname|port) "user admin
hostname example.com
port 22-l 與帳號@位址同時寫時套用哪一個,我們也用 -G 確認了。在 OpenSSH 9.9p1 中,套用的是以 -l 指定的 admin。
ssh -G -l admin user@example.com | grep -E "^(user|hostname) "user admin
hostname example.com大寫的 -L 名稱相似,卻是與帳號無關的本機連接埠轉發選項。它會把進入自己伺服器某個連接埠的連線,經由 SSH 連線內部轉送,連到遠端伺服器那一側的位址與連接埠。
8080:localhost:80 的意思是,把自己伺服器的 8080 連接埠,連到從遠端伺服器看到的 localhost 的 80 連接埠。用 -G 確認後,localforward 項目填進了相同的值。
ssh -G -L 8080:localhost:80 user@example.com | grep -E "^(hostname|localforward) "hostname example.com
localforward 8080 [localhost]:80只想讓通道保持開啟時,再加上不執行遠端指令、只維持連線的 -N。
4️⃣ 指定 SSH 連接埠與金鑰檔案
SSH 伺服器若在 22 以外的連接埠接受連線,就用 -p 指定連接埠。-i 用來指定不是預設名稱的私密金鑰檔案。
ssh -G -p 2222 -i ./mykey user@example.com | grep -E "^(user|hostname|port|identityfile) "user user
hostname example.com
port 2222
identityfile ./mykey指定 -i 後,預設金鑰檔案的七行消失,只留下指定的那一個檔案。
金鑰檔案用 ssh-keygen 建立。如果已有正在使用的金鑰,就在 -f 指定新的檔案名稱。下方是以新名稱 mykey 建立 ed25519 金鑰的結果。
ssh-keygen -t ed25519 -f ./mykey -N "" -C "user@example.com"Generating public/private ed25519 key pair.
Your identification has been saved in ./mykey
Your public key has been saved in ./mykey.pub
The key fingerprint is:
SHA256:XLbhLZHSNdMvUqhSIbzRNJi/zKKkNnWmy0mTeBoUfaY user@example.com
The key's randomart image is:
+--[ED25519 256]--+
| ..=+.+o |
| . =oo+.oo |
| . . +=B. . . |
| . =o=o=. . .|
| . E S++... . |
| . .o.+ +. |
| o+== . |
| +*oo |
| ...+. |
+----[SHA256]-----+mykey 是私密金鑰,mykey.pub 是公開金鑰。OpenSSH 手冊說明要把公開金鑰放進要連線的伺服器的 ~/.ssh/authorized_keys。這項作業可以像 [ssh-copy-id -i ./mykey.pub user@192.0.2.10] 這樣用 ssh-copy-id 完成。
經常連同一台伺服器的話,可在 ~/.ssh/config 寫好別名,之後只要輸入 ssh 加別名。Host 行就是別名,下面幾行是用這個別名連線時套用的值。
Host myserver
HostName 192.0.2.10
User user
Port 2222
IdentityFile ~/.ssh/mykey把這段設定寫進 ./config 檔案再用 -F 讀取確認,結果只用一個別名就套用了位址、帳號、連接埠與金鑰檔案。
ssh -F ./config -G myserver | grep -E "^(user|hostname|port|identityfile) "user user
hostname 192.0.2.10
port 2222
identityfile ~/.ssh/mykey命令列上寫的選項優先於設定檔。對同一個別名再加上 -p 22 後,port 變成了 22。
ssh -F ./config -G -p 22 myserver | grep -E "^(hostname|port) "hostname 192.0.2.10
port 22hostname 仍是設定檔中的 192.0.2.10,只有 port 換成命令列上寫的值。
5️⃣ 用 SSH 執行遠端指令
在連線目標後面寫上指令,ssh 就不顯示登入畫面,只執行那個指令後中斷連線。指令有多個或含有分號之類的 shell 符號時,要用單引號括起來。
ssh user@192.0.2.10 'whoami; hostname'user
server2遠端指令的結束代碼原樣回傳為 ssh 的結束代碼。在指令碼中,就用這個值判斷遠端指令是否成功。
ssh user@192.0.2.10 'exit 3'; echo $?3附上指令執行時,不會配置虛擬終端機。以 -T 執行的 tty 輸出了 [not a tty]。
ssh -T user@192.0.2.10 ttynot a ttyssh 手冊將 -t 說明為在遠端伺服器執行全螢幕型程式時使用的選項。加上 -t 後出現 /dev/pts/0,結束時還一併顯示已關閉連線的訊息。
ssh -t user@192.0.2.10 tty/dev/pts/0
Connection to 192.0.2.10 closed.再加上 -q 後,這則訊息就沒有出現。
ssh -t -q user@192.0.2.10 tty/dev/pts/0-n 會把 ssh 的標準輸入改為 /dev/null。不加 -n 執行時,遠端的 cat 原樣輸出了透過管線傳入的 hello。
echo hello | ssh user@192.0.2.10 cathelloecho hello | ssh -n user@192.0.2.10 cat同一個指令加上 -n 後,hello 沒有傳到遠端的 cat,所以什麼都沒有輸出。
6️⃣ SSH 連線錯誤與 ssh -v 除錯
連不上時,先從錯誤訊息確認停在哪個階段。找不到伺服器位址時,出現了 [Could not resolve hostname]。
ssh user@nosuchhost.invalidssh: Could not resolve hostname nosuchhost.invalid: Name or service not known位址正確但該連接埠沒有回應時,會出現 [Connection timed out]。加上 -o ConnectTimeout=5 後,5 秒後就以這個錯誤結束。
ssh -o ConnectTimeout=5 -p 2222 user@192.0.2.10ssh: connect to host 192.0.2.10 port 2222: Connection timed out以 -o BatchMode=yes 連線到不在 known_hosts 裡的伺服器時,ssh 沒有詢問主機金鑰就以 [Host key verification failed.] 結束。若要讓指令碼中的首次連線不停在詢問上,可使用 StrictHostKeyChecking=accept-new。
ssh -o BatchMode=yes user@192.0.2.10 trueHost key verification failed.根據 ssh_config 手冊,accept-new 只會不詢問就儲存從未見過的伺服器的主機金鑰。收到與已儲存金鑰不同的金鑰時,會拒絕連線。
ssh -o StrictHostKeyChecking=accept-new user@192.0.2.10 whoamiWarning: Permanently added '192.0.2.10' (ED25519) to the list of known hosts.
user帳號沒有登錄金鑰時,會出現 [Permission denied (publickey)]。反覆驗證失敗,伺服器可能會封鎖連線來源的 IP。
-v 會以 debug1 行輸出連線過程。完整輸出超過 70 行,所以下方只是用 grep 挑出的連線與驗證階段的行。
ssh -v -i ~/.ssh/id_ed25519 user@192.0.2.10 true 2>&1 | grep -E 'Connecting to|Connection established|remote software version|Server host key|is known and matches|can continue|Offering public key|Authenticated to|Exit status'debug1: Connecting to 192.0.2.10 [192.0.2.10] port 22.
debug1: Connection established.
debug1: Remote protocol version 2.0, remote software version OpenSSH_9.2p1 Debian-2+deb12u10
debug1: Server host key: ssh-ed25519 SHA256:9fT2kL0qX8vN4cR1yB6sW3mZ7aH5dE0uJ2pG8oK1iVc
debug1: Host '192.0.2.10' is known and matches the ED25519 host key.
debug1: Authentications that can continue: publickey,password
debug1: Offering public key: /root/.ssh/id_ed25519 ED25519 SHA256:4bN7qT1xW9cK3mR6yH0sD2fL8vZ5aJ1eP7uG3oX4iQs explicit
Authenticated to 192.0.2.10 ([192.0.2.10]:22) using "publickey".
debug1: Exit status 0Connecting to 行是嘗試連線,Server host key 與 is known and matches 行是主機金鑰檢查。在 Offering public key 行提出了金鑰,到 Authenticated to 行金鑰驗證完成。若停在驗證階段,先確認 Offering public key 行是否出現想用的金鑰檔案。
再加上 -C 後,kex 行的 compression 值從 none 變成了 zlib@openssh.com。
ssh -v -C user@192.0.2.10 true 2>&1 | grep -E 'compression'debug1: kex: server->client cipher: aes256-gcm@openssh.com MAC: <implicit> compression: zlib@openssh.com
debug1: kex: client->server cipher: aes256-gcm@openssh.com MAC: <implicit> compression: zlib@openssh.com
debug1: Enabling compression at level 6.-X 是把遠端伺服器上 GUI 程式的畫面帶到自己電腦的選項。在沒有螢幕的 AlmaLinux 伺服器上執行時,出現了表示沒有 DISPLAY 的 debug1 行。
ssh -v -X user@192.0.2.10 true 2>&1 | grep DISPLAYdebug1: X11 forwarding requested but DISPLAY not setDISPLAY 是決定 GUI 畫面顯示位置的環境變數。所以 -X 要在有桌面畫面的電腦上連線時使用。
🔲 SSH 指令模擬器
在下方的模擬器中,可以用 ssh 連到虛擬伺服器,親自輸入選項、遠端指令與 ssh -G 來確認。
🔢 FAQ & 推薦內容
SSH
Linux SSH 的定義與基本設定
整理 SSH 取代不加密的 Telnet 而出現的背景、預設連接埠 22、金鑰驗證方式與安裝方法的文章。
安全性
OpenSSH 漏洞 CVE-2024-6387:暫時封鎖與套用修補程式
介紹 OpenSSH 漏洞 regreSSHion 如何利用登入等待時間的 alarm 訊號,以及我們先暫時封鎖再套用修補程式之順序的文章。
Cloudways
Cloudways SFTP & SSH 連線方法:FileZilla 設定、新增 SSH 金鑰與 IP 白名單
記錄在代管雲端伺服器登錄 SSH 金鑰、把連線 IP 加入白名單後,用 ssh 與 FileZilla 連線過程的文章。
ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。