SSH 指令:-l、-p、-i 選項用法與連線錯誤確認

測試環境RHEL 系列AlmaLinux 9.8OpenSSH 9.9p1接收端 Debian 12 · OpenSSH 9.2p1 一般帳號root 帳號
網路指令ssh位置/usr/bin/ssh

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.10
Linux 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 whoami
The 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.10
The 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 時,可用選項的清單會以用法說明的形式顯示。

ssh
usage: 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 -V
OpenSSH_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 none

identityfile 這七行,是沒有指定 -i 時 ssh 依序尋找的預設金鑰檔案。connecttimeout none 表示沒有另外設定連線等待時間。

選項複製說明
-l帳號指定連線用的帳號名稱
-p連接埠指定連線的連接埠(預設 22)
-i金鑰檔案指定私密金鑰檔案
-v以 debug1 行輸出連線過程
-C壓縮收送的資料
-XX11 轉發(遠端 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 whoami
user

用 -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 22

hostname 仍是設定檔中的 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 tty
not a tty

ssh 手冊將 -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 cat
hello
echo hello | ssh -n user@192.0.2.10 cat

同一個指令加上 -n 後,hello 沒有傳到遠端的 cat,所以什麼都沒有輸出。

6️⃣ SSH 連線錯誤與 ssh -v 除錯

連不上時,先從錯誤訊息確認停在哪個階段。找不到伺服器位址時,出現了 [Could not resolve hostname]。

ssh user@nosuchhost.invalid
ssh: 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.10
ssh: 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 true
Host key verification failed.

根據 ssh_config 手冊,accept-new 只會不詢問就儲存從未見過的伺服器的主機金鑰。收到與已儲存金鑰不同的金鑰時,會拒絕連線。

ssh -o StrictHostKeyChecking=accept-new user@192.0.2.10 whoami
Warning: 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 0

Connecting 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 DISPLAY
debug1: X11 forwarding requested but DISPLAY not set

DISPLAY 是決定 GUI 畫面顯示位置的環境變數。所以 -X 要在有桌面畫面的電腦上連線時使用。

🔲 SSH 指令模擬器

在下方的模擬器中,可以用 ssh 連到虛擬伺服器,親自輸入選項、遠端指令與 ssh -G 來確認。

SSH 指令模擬器AlmaLinux 9.8 → Debian 12
[root@server work]#
只在瀏覽器內運作,不會連到真正的伺服器。按 ↑↓ 可叫出先前輸入的指令。

🔢 FAQ & 推薦內容

加上 -o ServerAliveInterval=60,每 60 秒會向伺服器送出訊號以維持連線。用 -G 確認後,serveraliveinterval 從預設值 0 變成了 60。不想每次都寫的話,就在 ~/.ssh/config 的 Host 底下加上同樣的項目。

ssh 的用法說明中沒有接收密碼的選項。密碼驗證是在連線時被詢問時輸入;需要自動連線的作業,則以 ssh-keygen 建立的金鑰驗證。

在 -J 寫上要經過的伺服器。用 -G 確認 [ssh -J admin@bastion.example.com user@192.0.2.10] 後,要經過的伺服器填進了 proxyjump 項目。

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 7   +   1   =