在需要密码时检查是否可以进行SSH连接

时间:2015-12-18 17:30:18

标签: bash shell ssh

我正在尝试编写一个脚本,将更多服务器作为运行状况检查或安全性测试。我不需要通过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连接到这些服务器(考虑到我的约束),以及它是什么样的?

我不需要最后的脚本作为答案(尽管这样会更好)。正确方向的一些指示对我有很大帮助。

谢谢!

3 个答案:

答案 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
希望它会有所帮助。