端口转发失败时,可以使SSH失败吗?


38

如果我进行远程端口转发,即-R 3690:localhost:3690当远程主机上的端口上已经存在绑定时,我会收到以下警告:

Warning: remote port forwarding failed for listen port 3690

有没有办法使ssh失败(即以非零返回码退出),而不只是发出警告?


您实际上是否还需要建立一个终端通道,或者仅仅是转发?
伊格纳西奥·巴斯克斯

1
@ IgnacioVazquez-Abrams:只是转发。
马特·乔纳

Answers:


62

ssh -o "ExitOnForwardFailure yes" ...

或放

ExitOnForwardFailure yes

进入~/.ssh/config。有关详细信息,请参见ssh_config(1)使用man


不幸的是我有OpenSSH4。您能告诉我何时添加了此功能吗?
马特·乔纳

2
不,我不知道。它可能是版本5的功能。但是版本4现在必须已经存在很多年了,并且一直都有安全修复程序。如果您不能自己升级服务器,则可能需要询问服务器管理员是否认为继续使用该版本是安全的。
Andrew Schulman

请注意,如果未明确指定,bind_address则ssh可能仍然不会失败。例如,如果另一个用户已经在ipv6本地主机上侦听,[::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 2016年

3
也可以使用ssh -o ExitOnForwardFailure = yes来避免空格和引号的需要。
自由空间

1

我在目标主机上使用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运行客户端脚本


2
我想避免的情况是端口转发已经存在,并给出警告。我认为此脚本会将与端口的现有绑定视为成功,而不是失败。
马特·乔纳

1
这是真的。我的问题是在超时之前,同一脚本将端口保持打开状态几分钟。该脚本将退出并重新运行几次,然后端口将再次打开。如果您需要确定谁是该端口的所有者,可以尝试使用sudo运行netstat -anp并对其进行grepping。
AnttiRytsöläCircles请参阅2011年

@AnttiRytsöläCirclesConsult:请注意,您可能需要检查进程ID,例如,在“ ssh”上进行匹配,因为进程名称仍然无法告诉您哪个SSH客户端当前正在转发该端口。
Piskvor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.