Bash

即使連接失敗,SSH程序也能保持活動狀態?

  • April 20, 2017

在嘗試建立 ssh 隧道時,我注意到即使連接失敗,該程序仍然存在。例如,如果我在hostname關閉時嘗試執行此命令:

/usr/bin/ssh -f -i /home/user/.ssh/id_rsa -N -R 3000:localhost:22 user@hostname

偶爾我會得到回應:

Warning: remote port forwarding failed for listen port 3000

當原始程序(在本地機器上執行)死亡但遠端伺服器尚未實現時,我只會收到此錯誤消息。該程序嘗試重新啟動,但伺服器認為它仍然在 3000 上有一個連接,並且除了新連接之外不會,導致上面的警告。

但是,如果我這樣做,pgrep -x ssh我可以看到該過程仍然存在。我想在 cronjob 中將這個 ssh 命令作為 bash 腳本的一部分執行,它首先檢查隧道是否已建立,如果沒有重新建立它,但是我有腳本設置它的方式 a) 看到隧道是down 並嘗試創建一個新程序(秘密失敗),或者 b) 看到失敗的程序是活動的並且什麼都不做。結果是只要失敗的程序仍然存在,隧道就永遠不會重新建立。

如果連接失敗而不是收到警告,有沒有辦法殺死程序?

對於其他可能找到答案的人,我在這個答案中找到了我想要的選項:如果埠轉發失敗,添加-o ExitOnForwardFailure=True到命令會強制 ssh 退出,而不是創建殭屍程序:

/usr/bin/ssh -f -i /home/user/.ssh/id_rsa -N -R 3000:localhost:22 user@hostname -o ExitOnForwardFailure=True

給 ClientAliveInterval 一個機會。

人 sshd_config

    ClientAliveInterval
        Sets a timeout interval in seconds after which if no data has been received from the client, sshd(8) will send a message through
        the encrypted channel to request a response from the client.  The default is 0, indicating that these messages will not be sent
        to the client.

引用自:https://unix.stackexchange.com/questions/359740