我正在尝试编写一个脚本,将更多服务器作为运行状况检查或安全性测试。我不需要通过SSH实际运行任何东西。
我们有一些服务器正在运行,出于安全考虑,我们并不总是允许他们使用SSH,我希望有一个我可以运行的脚本来确认哪些是可访问的,哪些不是。
我意识到StackExchange充满了这些问题,所以我很快找到this suggestion:
$ ssh -q user@downhost exit
$ echo $?
255
$ ssh -q user@uphost exit
$ echo $?
0
基本上,只要连接不可能,它就会返回255
,但这里是我遇到问题的地方。我们的服务器需要密钥文件 AND 用户/密码验证。
拥有BatchMode=yes
如果我没有密码约束,我可以测试它。
我可以给脚本提供文件的位置,没问题。但我每次都会255
,因为服务器需要密码,如this answer中所示。
基本上我的问题是:
是否有可能编写一个脚本,让我知道是否可以通过SSH连接到这些服务器(考虑到我的约束),以及它是什么样的?
我不需要最后的脚本作为答案(尽管这样会更好)。正确方向的一些指示对我有很大帮助。
谢谢!
答案 0 :(得分:5)
您可以使用netcat
。
如果您对端口打开感兴趣,可以使用:
if nc -w 5 -z "$server" 22 ; then
echo "Port 22 on $server is open"
fi
如果您对该端口上实际运行的ssh守护程序感兴趣,您可以分析服务器的hello消息:
if [[ $(nc -w 5 "$server" 22 <<< "\0" ) =~ "OpenSSH" ]] ; then
echo "open ssh is running"
fi
顺便说一句,使用选项-w
,您可以指定连接超时(以秒为单位)。我为这个例子选择了5秒
答案 1 :(得分:2)
你能用&#34;期待&#34;(TCL)?如果是这样,您可以使用如下脚本:
#!/usr/bin/expect
set timeout 6
set IP [lindex $argv 0]
spawn ssh -o StrictHostKeyChecking=no teste@$IP
expect "password:" {
send_user "\n1\n"
exit
}
send_user "\n0\n"
要运行脚本,请使用:
./script.sh "SSH server IP"
此脚本将运行expect并启动连接到您在第一个参数上传递的IP的ssh程序。如果&#34;密码:&#34;提示返回到此脚本,它只是完成。当然这只是一个想法,你必须开发和解析脚本返回的内容。
答案 2 :(得分:1)
如果您的.ssh中安装了有效密钥,则可以使用以下内容(一次,而不是脚本的一部分):
ssh-copy-id user@downhost
这将询问您的密码并将密钥复制到服务器,以便您下次可以无密码登录。
之后你应该能够在没有密码的情况下运行你的命令:
ssh -q user@downhost exit
希望它会有所帮助。