我們經常通過 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

ControlMasterControlPath 兩個選項控制 socket 的文件路徑信息方便 agent 方式複用 socket 文件登錄機器, 更多可以參考 ssh-agent .

相關文章