Bash
即使連接失敗,SSH程序也能保持活動狀態?
在嘗試建立 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.