考虑到 SF 问题的优秀答案“防止针对 SSH 的暴力攻击“,我正在考虑在测试服务器上配置端口敲击。我正在考虑如何轻松地连接到该服务器和其他端口敲击服务器。
/.ssh/config
我通常这样配置 rsa 身份验证、地址和用户名:
Host msUpdate
User bgates
Hostname updates.microsoft.com
IdentityFile ~/.ssh/id_rsa.bgates.pub
因此,我只需键入即可ssh msUpdate
登录服务器。据我所知,/.ssh/config
没有用于配置端口敲击的工具。因此,我正在考虑一个包装器脚本,ssh
它将自动处理敲击:
$ cat login
#!/bin/bash
msUpdate=( 2000 3000 4000 )
otherServer=( 1024 2048 4096 )
for PORT in ${$@}; do
ssh -p $PORT
sleep 1
done
ssh $@
我的问题是如何编写该for
行。我似乎无法让脚本将参数识别为要替换的数组的名称。虽然表面上是一个 Bash 问题,但我还是在 SF 上提问,因为我觉得完成的脚本对本网站的用户最有用,而且如果有比这里更好的方法,很可能有人会告诉我。
答案1
您正在尝试使用间接,但关联数组(又称“哈希”)是更好的方法。您需要使用支持此功能的语言,例如 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"
使用您要登录的服务器名称调用脚本:
./scriptname otherServer
使用除“login”之外的其他名称作为脚本名称,因为这是现有可执行文件的名称。
始终避免使用全大写的变量名,以防止与 shell 变量发生名称冲突。
答案2
您需要在 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 安全的双因素身份验证。