连接到端口受保护的资源

考虑到SF问题“ 防止对SSH的powershell攻击 ”的优秀答案,我正在考虑在testing服务器上configuration端口敲打。 我在辩论如何连接到这个服务器和其他轻松端口的服务器。

我通常在/.ssh/configconfigurationrsa身份validation,地址和用户名,例如:

 Host msUpdate User bgates Hostname updates.microsoft.com IdentityFile ~/.ssh/id_rsa.bgates.pub 

因此,我可以简单地键入ssh msUpdatelogin到服务器。 据我所知,/ /.ssh/config没有configuration端口敲击的function。 因此,我正在考虑ssh的包装脚本,它将自动处理敲击:

 $ cat login #!/bin/bash msUpdate=( 2000 3000 4000 ) otherServer=( 1024 2048 4096 ) for PORT in ${$@}; do ssh -p $PORT sleep 1 done ssh $@ 

我的问题是如何写行。 我似乎无法让脚本将参数识别为要replace的数组的名称。 虽然表面上是一个Bash的问题,但是我问SF,因为我觉得完成的脚本对于这个站点的用户来说是最有用的,也因为如果有更好的方法比最有可能在这里有人会让我知道它。

你正试图使用间接寻址 ,但是一个关联数组(AKA“hash”)是更好的方法。 您将需要使用支持此function的语言,例如Bash 4,AWK,ksh93,Perl,Python等。

如果你有Bash 4,你可以按如下方式使用关联数组。 值不能是数组,但是可以使用由空格分隔的端口列表,因为列表成员不会包含空格。

 #!/bin/bash declare -A servers servers[msUpdate]='2000 3000 4000' servers[otherServer]='1024 2048 4096' for port in ${servers[$1]} do ssh -p "$port" "$1" sleep 1 done ssh "$1" 

使用要login的服务器的名称来调用脚本:

 ./scriptname otherServer 

因为这是现有可执行文件的名称,所以请使用“login”以外的名称作为脚本名称。

总是避免使用全大写variables名来防止可能的与shellvariables的名称冲突。

您需要在for循环中使用数组名称

 for PORT in "${msUpdate[@]}" do ssh -p $PORT host.tld done 

更好的是主观的,我已经看到用这样的脚本实现端口敲门,但它使用nmap做敲门不ssh

 for PORT in "${msUpdate[@]}" do nmap -Pn --host_timeout 100 --max-retries 0 -p $PORT host.tld done ssh -p someport host.tld 

你也可以考虑一个像Duo Security的双因素authentication的替代scheme。