ssh/scp 自動連接使用技巧
我們經常通過 ssh/scp
免密登錄的方式來自動化的批量執行一些操作, 不過在實際的使用中可能經常碰到下面幾種中斷自動連接的問題.
引起中斷的問題
目前主要由以下幾方面問題會引起連接中斷:
Host key 添加提示
在連接新的機器的時候, 通常需要將新機器的加密指紋信息添加到自身的 ~/.ssh/known_hosts
中. 如下所示, 這種提示需要我們手動確認, 會暫停自動登錄操作, 即便新機器保存着連接機的公鑰信息.
$ ssh newhost The authenticity of host 'newhost (10.0.1.2)' can't be established. ECDSA key fingerprint is SHA256:+PmcUMRVQIccL3N7WEkjRuZ5B5iyyVJDV2MGekPXCoo. ECDSA key fingerprint is MD5:5a:eb:33:c8:ae:be:b0:d7:f0:ec:e3:a2:d8:92:2e:77. Are you sure you want to continue connecting (yes/no)?
可以通過 expect
等工具處理此提示, 也可以通過設置 ssh/scp
選項跳過確認過程而直接登錄新機器, 如下所示:
$ ssh -o StrictHostKeyChecking=no newhost Warning: Permanently added '10.0.1.2' (RSA) to the list of known hosts. Last login: Fri Feb 14 03:53:33 2020 from 10.0.1.10 [cztest@cz ~]$
StrictHostKeyChecking=no
選項會忽略確認過程, 自動將指紋信息加到 ~/.ssh/known_hosts
中.
指紋信息變更
這種問題通常在重新初始化遠程機器的時候, 比如重裝機器, ssh 的指紋信息變更, 如下所示:
$ ssh newhost @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...... ...... Host key verification failed.
該問題同樣可以通過 StrictHostKeyChecking=no
選項解決:
$ ssh -o StrictHostKeyChecking=no newhost @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...... ...... Last login: Sat Feb 15 09:26:58 2020 from 10.0.1.10 [cztest@cz ~]$
連接超時
在執行一些比較重的操作的時候, 可能會出現連接超時斷開的情況, 這種問題一方面可能是因爲操作確實費時, 操作等待的時間過長, 也有可能是因爲一些代理中間件(比如 haproxy) 的連接超時設置而引起中斷. 這些本質上都是因爲 tcp 連接長時間沒有通信引起的, 可以通過以下選項對連接進行保活:
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=20 server
上面的選項每 60s 發送一次保活信息, 最多發送 20 次. 實際使用中可以按需調整這兩個參數.
另外, 有的機器設置了一些超時參數避免長時間不操作而佔用連接的情況, 如下所示:
TMOUT=600 readonly TMOUT
TMOUT
可以用來控制連接的輸入行爲, 在交互式中很有用. 上面將 TMOUT
設置爲只讀變量, 所有連接到此機器的連接在 10 分鐘內沒有 read(bash buildin, 比如沒有輸入命令)
操作則斷掉連接. 這種情況無法通過 ssh
的選項來避免, 可以通過一些 ssh 的工具避免此類問題, 比如 SecureCRT
工具的 session options -> Terminal -> Anti-idle
功能指定每隔一定時間對連接的會話發送一些特殊字符來避免 TMOUT
引起的中斷.
使用建議
實際的使用中可以通過對 ssh/scp
增加以下選項儘量避免自動登錄失敗:
-o ServerAliveInterval=60 -o ServerAliveCountMax=20 -o StrictHostKeyChecking=no -o PasswordAuthentication=no -o BatchMode=yes -o ConnectTimeout=8
在啓用 BatchMode
的時候, ssh/scp
會忽略輸入密碼的提示, 這點在批量操作的時候很有用. 另外也可以將上面的選項增加到 ~/.ssh/config
配置中, 如下所示:
Host * GSSAPIAuthentication no ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p ForwardAgent yes TCPKeepAlive yes ServerAliveInterval 60 ServerAliveCountMax 20 StrictHostKeyChecking no PasswordAuthentication no BatchMode yes ConnectTimeout 8
ControlMaster
和 ControlPath
兩個選項控制 socket 的文件路徑信息方便 agent 方式複用 socket 文件登錄機器, 更多可以參考 ssh-agent
.
↑