伺服器維運

SSH 命令怎麼用:格式、連接埠、金鑰、跳板機與常用引數

SSH 命令的基本格式是 ssh 使用者名稱@主機,例如 ssh [email protected];連接埠不是 22 時加 -p 連接埠,指定私鑰加 -i 私鑰檔案,經跳板機加 -J 跳板機,其他配置項用 -o 名稱=值 臨時設定。經常連的伺服器寫進 ~/.ssh/config,之後一條 ssh 別名就能連上。

作者 頂聯產品團隊發布於 7 分鐘閱讀

SSH 命令用來從命令列登入遠端伺服器、在上面執行命令,格式是 ssh [選項] [使用者名稱@]主機 [遠端命令]。最常見的寫法是 ssh [email protected];伺服器的 SSH 連接埠不是 22 時加 -p,如 ssh -p 22022 [email protected];用指定的私鑰登入加 -i ~/.ssh/私鑰檔案;伺服器在內網、要先經過跳板機,用 -J 跳板機;其他任何客戶端配置項都能用 -o 名稱=值 臨時設定。Linux、macOS 和 Windows 10/11 自帶的都是 OpenSSH 客戶端,本文的命令在三個系統上通用。

ssh 命令格式:使用者名稱、主機和遠端命令怎麼寫

ssh [email protected]                 # 使用者名稱@主機,最常用
ssh -l root 10.30.5.21              # 用 -l 指定使用者名稱,效果相同
ssh 10.30.5.21                      # 不寫使用者名稱,預設使用本機當前的登入名
ssh ssh://[email protected]:22022     # URI 寫法,連接埠可以直接寫在裡面
ssh root@2001:db8::21               # IPv6 位址直接寫,不需要方括號
ssh [email protected] 'df -h /'       # 主機後面的內容作為遠端命令執行,執行完即斷開

寫法上的幾條規則:

  • 主機可以是 IP、域名,或 ~/.ssh/config 裡定義的別名。 別名的寫法見後文的例項。
  • 選項寫在主機前面。 OpenSSH 也接受緊跟在主機後面的選項,但從主機之後第一個不以 - 開頭的詞起,剩下的內容全部算作遠端命令,例如 ssh [email protected] uptime -p 裡的 -p 是交給 uptime 的引數,不是連接埠。把選項全部寫在主機前面,不容易出錯。
  • 使用者名稱省略時取本機登入名。 在 Windows 上,你的登入名可能是 Administrator 或一箇中文名,伺服器上沒有這個使用者,表現為密碼怎麼輸都不對,所以使用者名稱最好每次都寫明。
  • 不帶遠端命令就是互動式登入。 登入後提示符變成伺服器的主機名,輸入 exit 或按 Ctrl+D 退出。

ssh 命令怎麼指定連接埠

伺服器把 SSH 連接埠從 22 改成別的連接埠後,連線時必須告訴客戶端,三種寫法任選:

ssh -p 22022 [email protected]           # 最常用
ssh ssh://[email protected]:22022        # URI 寫法
ssh -o Port=22022 [email protected]      # 用 -o 設定 Port 選項

常見的寫錯方式和對應的現象:

錯誤寫法 現象 正確寫法
ssh [email protected]:22022 Could not resolve hostname 10.30.5.21:22022,冒號和連接埠被當成了主機名的一部分 ssh -p 22022 [email protected]
ssh -P 22022 [email protected] 大寫 -P 不是連接埠引數:老版本直接報錯並列印用法;新版本把它當作配置標籤(Tag),照樣去連 22 連接埠 ssh 用小寫 -p;scp、sftp 才用大寫 -P
連接埠寫對了但一直等待,最後 Connection timed out 防火牆或安全組沒有放行新連接埠 在本機執行 nc -zv 10.30.5.21 22022 測試連接埠是否可達,Windows 上用 PowerShell 執行 Test-NetConnection 10.30.5.21 -Port 22022
連接埠寫對了但立即 Connection refused 伺服器在,但這個連接埠上沒有 sshd 監聽 從控制檯登入,執行 ss -tlnp,在輸出裡找 sshd 那一行,看它實際監聽的連接埠

連接埠的取值順序是:命令列引數優先,其次是 ~/.ssh/config,最後是系統級的 /etc/ssh/ssh_config。命令列裡寫了 -p,配置檔案裡同一主機的 Port 就不起作用。rsync 經 SSH 連非標準連接埠時寫成 rsync -e 'ssh -p 22022'。

常用引數與 -o 選項速查

命令列引數

引數 作用 什麼時候用
-p 連接埠 指定伺服器的 SSH 連接埠 連接埠不是 22
-l 使用者名稱 指定登入使用者 與 使用者名稱@ 二選一
-i 私鑰檔案 用指定的私鑰認證 私鑰不是預設檔名(不加 -i 時 ssh 只自動嘗試 ~/.ssh/id_ed25519、id_rsa 等預設名稱和 ssh-agent 裡的金鑰),或用雲廠商下發的 .pem 檔案;私鑰許可權要設為 600
-J 跳板機 先連跳板機,再從它轉到目標,多個跳板用逗號分隔 目標在內網,只能經跳板機存取
-o 名稱=值 臨時設定任意配置項 見下一張表
-v、-vv、-vvv 輸出除錯資訊,v 越多越詳細 連不上、認證失敗時排查
-t 強制分配終端 遠端命令需要互動,如 sudo 要輸密碼、執行 top
-n 不讀取本機的標準輸入 在 while read 迴圈裡批次執行
-N 只建立連線,不執行遠端命令 單純做連接埠轉發
-f 認證完成後轉到後台 與 -N 搭配,讓隧道在後台執行
-L 本地連接埠:目標:目標連接埠 本地連接埠轉發 經跳板機存取內網的網頁、資料庫
-D 本地連接埠 動態轉發,本機變成一個 SOCKS5 代理 經跳板機存取整個內網網段
-R 遠端連接埠:目標:目標連接埠 遠端連接埠轉發 讓遠端能存取到本機這一側的服務
-C 壓縮傳輸 低速鏈路上傳輸大量文字輸出
-4、-6 只用 IPv4 或 IPv6 域名同時有 A 和 AAAA 記錄,想固定走其中一種
-F 配置檔案 使用指定的配置檔案 測試新配置,或不同專案用不同的配置
-G 不連線,只列印對這個主機最終生效的配置 檢查配置檔案寫得對不對

-o 常用選項

選項 作用 使用場景
ConnectTimeout=5 建立連線最多等 5 秒 批次指令碼里跳過不通的機器,不必每台卡很久
ServerAliveInterval=30 每 30 秒向伺服器發一次保活訊息 經過 NAT 或防火牆時,長時間不操作會被斷開
ServerAliveCountMax=3 連續 3 次沒有回應就斷開 與上一項配合,及時發現連線已經斷了
StrictHostKeyChecking=accept-new 首次連線的主機自動接受,已記錄的主機金鑰變了仍然拒絕 批次連新裝的機器
UserKnownHostsFile=/dev/null 不讀也不寫 known_hosts 救援系統、PXE 裝機環境每次啟動主機金鑰都不同;只在可信的內網裡與 StrictHostKeyChecking=no 搭配使用
BatchMode=yes 不彈出任何密碼或確認提示,需要輸入時直接失敗 定時任務、指令碼
PubkeyAuthentication=no 不嘗試金鑰,直接走密碼認證 測試密碼登入是否可用
IdentitiesOnly=yes 只提交 -i 或配置裡指定的私鑰 本機金鑰太多,報 Too many authentication failures
HostKeyAlgorithms=+ssh-rsa 額外允許舊的主機金鑰演算法 連韌體較老的交換器、BMC,報 no matching host key type
LogLevel=ERROR 不顯示警告資訊 指令碼輸出裡不想出現 Warning 行

例項:連線機房裡改過連接埠、只能經跳板機存取的伺服器

假設這樣一個環境:維運人員只能從公網存取跳板機 jump.example.com,它的 SSH 連接埠是 2222,登入使用者 ops;目標伺服器 10.30.5.21 在機房內網,sshd 改到了 22022 連接埠,用 root 和私鑰 ~/.ssh/idc_ed25519 登入。

一條命令連線:

ssh -i ~/.ssh/idc_ed25519 -J [email protected]:2222 -p 22022 [email protected]

這裡有兩個連接埠,別寫混:跳板機的連接埠寫在 -J 的位址後面(主機:連接埠),-p 只作用於最後的目標伺服器。-J 的原理是先登入跳板機,讓它把一條 TCP 連線轉到 10.30.5.21:22022,本機再透過這條連線直接與目標伺服器完成認證,私鑰始終留在本機。注意 -i 和 -p 一樣只作用於目標伺服器:連跳板機的那一段不會帶上 -i,用的是預設檔名的私鑰、ssh-agent 裡的金鑰,或 ~/.ssh/config 裡給跳板機寫的 IdentityFile。跳板機也只認這把專用私鑰時,這條命令會在跳板機一步就認證失敗,改用下面的配置檔案寫法即可。所以本機要能同時透過跳板機和目標伺服器的認證,跳板機上也要允許 TCP 轉發(sshd 的 AllowTcpForwarding,預設開啟);部分商業堡壘機為了審計會關閉轉發,這時 -J 不能用。OpenSSH 7.3 之前的老客戶端沒有 -J,改寫成:

ssh -o ProxyCommand="ssh -W %h:%p -p 2222 [email protected]" -p 22022 [email protected]

寫進 ~/.ssh/config,以後只敲別名:

Host idc-jump
    HostName jump.example.com
    Port 2222
    User ops
    IdentityFile ~/.ssh/idc_ed25519

Host idc-web01
    HostName 10.30.5.21

Host idc-* !idc-jump
    Port 22022
    User root
    IdentityFile ~/.ssh/idc_ed25519
    ProxyJump idc-jump

之後 ssh idc-web01 就完成了上面那條長命令的全部工作;scp、sftp、rsync 使用這個別名時,也會自動帶上連接埠、使用者和跳板設定。再加一台內網伺服器,只需要補一個兩行的段落,例如 Host idc-web02 加上它的 HostName。

Host idc-* !idc-jump 裡的 !idc-jump 不能省:通配的 idc-* 也會匹配到跳板機自己,ProxyJump 就會讓跳板機去經過自己連線,形成迴圈。配置寫完,用 -G 檢查最終生效的值,不用真的連線:

ssh -G idc-web01 | grep -E '^(hostname|port|user|proxyjump) '

輸出應當是 hostname 10.30.5.21、port 22022、user root、proxyjump idc-jump。哪一項不對,就回去看是不是被更靠前的 Host 段先設定了:同一個選項,ssh 只採用第一次匹配到的值。

遠端執行命令、批次操作與連接埠轉發

遠端執行命令

ssh idc-web01 'uptime; df -h /'                      # 執行多條命令,用分號隔開
ssh -t idc-web01 'sudo systemctl restart nginx'      # sudo 要輸入密碼,必須加 -t
ssh idc-web01 'bash -s' < check.sh                   # 把本機的指令碼交給遠端執行,指令碼不用先上傳

遠端命令用單引號還是雙引號,結果不一樣:ssh idc-web01 "echo $HOSTNAME" 列印的是本機的主機名,因為雙引號裡的變數在本機就被展開了;寫成單引號,變數才會到遠端展開。不加 -t 執行需要輸入密碼的 sudo,會看到 sudo: a terminal is required to read the password 的報錯。

批次操作多台伺服器

while read -r h; do
  printf '%s  ' "$h"
  ssh -n -o BatchMode=yes -o ConnectTimeout=5 "$h" 'uptime' || echo "連線失敗"
done < hosts.txt

-n 必不可少:ssh 預設會讀取標準輸入,不加它,第一台機器就把 hosts.txt 剩下的內容全部讀走,迴圈只執行一次。BatchMode=yes 讓需要輸入密碼的機器直接報錯跳過,不會卡在提示上,所以批次操作前要先配好金鑰登入。

連接埠轉發:不暴露 BMC,也能開啟它的網頁

伺服器的 BMC 管理口通常在單獨的管理網裡,不對公網開放。需要臨時開啟某台 BMC 的網頁時,經跳板機轉發即可:

# 本機 8443 連接埠轉發到 BMC 10.20.0.15 的 443 連接埠,然後瀏覽器開啟 https://127.0.0.1:8443
ssh -N -L 8443:10.20.0.15:443 idc-jump

# 本機 1080 連接埠作為 SOCKS5 代理,瀏覽器設定代理後可以存取整個管理網
ssh -N -D 1080 idc-jump

-L 只轉發一個連接埠,BMC 的網頁能開啟,但遠端控制檯、虛擬介質如果用的是其他連接埠,還要再加對應的 -L;-D 把本機變成代理,瀏覽器發出的所有連線都經跳板機轉出,多個連接埠一次解決。轉發期間終端視窗不要關,用完按 Ctrl+C 斷開。

在管理系統裡怎麼落地

命令列的 ssh 適合維運人員自己用。給租用伺服器的客戶,或者一個需要多人協作的機房,問題會變成:客戶不會配連接埠和金鑰,維運每人一套跳板配置,事後說不清誰在哪台機器上執行過什麼命令。在 Toplink DCIM 裡,客戶登入客戶自助端就能管理名下伺服器的 SSH 金鑰,並在瀏覽器裡直接開啟 SSH、VNC 或 RDP 控制檯,本機不用裝客戶端;維運人員透過 IPMI 遠端管理發起的每一次遠端會話都會自動錄影,可以倍速回放、拖動進度,SSH 和 Telnet 會話另外保留命令級日誌,事後能查到每條命令是誰執行的。

常見問題

-J 跳板和 -A 代理轉發有什麼區別?

-J 讓跳板機只負責轉發 TCP 連線,你的私鑰和認證過程都留在本機,跳板機看不到也用不了。-A 把本機的 ssh-agent 轉發到遠端,遠端上擁有 root 許可權的人在你連線期間可以借用它登入其他伺服器。只是為了穿過跳板機,用 -J 就夠了,-A 只在確實需要從遠端再發起認證、且信任這台機器時使用。

Windows 自帶的 ssh 命令和 Linux 上的一樣嗎?

Windows 10、11 自帶的是移植版 OpenSSH,-p、-i、-J、-L、-D、-o 等用法相同,配置檔案在 C:\Users\使用者名稱\.ssh\config。不同之處是不支援 ControlMaster 連線複用;個別版本里 ProxyJump 會報找不到程式,可以改用 ProxyCommand 並寫出 ssh.exe 的完整路徑。

ssh -v 的輸出怎麼看?

重點看三處:Connecting to 那一行確認連的位址和連接埠是否正確;Authentications that can continue 列出伺服器允許的認證方式;Offering public key 之後如果沒有出現 Server accepts key,說明提交的這把金鑰不被接受。還不夠清楚時用 -vvv 輸出更多細節。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88