題 端口轉發失敗時是否可以使SSH失敗?


如果我做一個遠程端口前進,一個la -R 3690:localhost:3690 當遠程主機上的端口上已存在綁定時,我收到此警告:

Warning: remote port forwarding failed for listen port 3690

有沒有辦法讓ssh失敗(即退出非零返回碼),而不是只發出警告?


31
2017-10-31 01:13


起源


你真的需要建立一個終端頻道,還是僅僅轉發? - Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams:只是轉發。 - Matt Joiner


答案:


ssh -o "ExitOnForwardFailure yes" ...

或者說

ExitOnForwardFailure yes

~/.ssh/config。看到 ssh_config(1) 運用 man 詳情。


52
2017-10-31 20:41



不幸的是我有OpenSSH 4.你能告訴我什麼時候添加這個功能嗎? - Matt Joiner
不,我不知道。它可能是第5版功能。但版本4現在必須已經很多年了,而且有 安全修復 每時每刻。如果您無法自行升級服務器,您可能需要詢問您的服務器管理員他/她是否認為繼續使用該版本是安全的。 - Andrew Schulman
請注意,如果您沒有明確指定 bind_address 然後ssh可能仍然沒有失敗。例如,如果另一個用戶已經在偵聽ipv6 localhost [::1]:3690 然後ssh可能只綁定ipv4 127.0.0.1:3690 並且不抱怨。但是你的svn客戶端可能更喜歡ipv6套接字(攻擊者)。為了更安全,更好地使用 -R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690 - rudimeier


我在目標主機上使用bash腳本以確保正確打開轉發。 SSH連接將運行此連接並在端口轉發出現問題時退出,例如

客戶端腳本:(這使用.ssh / config進行端口轉發設置)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

服務器端腳本(bin / sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

甚至可以使用-dmS在屏幕下運行客戶端腳本


1
2017-11-04 11:10



我試圖避免的情況是端口轉發已經存在,並給出警告。我認為這個腳本會將對端口的現有綁定視為成功,而不是失敗。 - Matt Joiner
這是真的。我的問題是在超時前將端口打開幾分鐘的相同腳本。 Thsi腳本將退出並重新運行幾次,之後端口將再次打開。如果您需要確定誰擁有該端口,您可以嘗試使用sudo運行netstat -anp並輕擊它。 - anttir