首页 > 解决方案 > 在多个主机上使用 Bash Shell 脚本进行 SSH 身份验证验证

问题描述

我知道还有其他解决方案,例如expect, 或Python paramiko,但这bash shell是目前唯一可用的选项。

在这 3 个 IP 中,仅172.16.1.2安装了 SSH 服务器并且它们具有相似的密码。

wolf@linux:~$ cat ip.txt
172.16.1.1
172.16.1.2
172.16.1.3
wolf@linux:~$

这是 Bash 脚本

wolf@linux:~$ cat sshSession.sh
while read host
do
    export SSH_ASKPASS='~/ePass'
    setsid ssh -T user@$host
    if [ $? = 0 ]; then
        exit
        echo "$host | SSH Authentication OK"
    else
        echo "$host | SSH Authentication PROBLEM"
    fi
done < ip.txt
wolf@linux:~$ 

输出

wolf@linux:~$ ./sshSession.sh
ssh: connect to host 172.16.1.1 port 22: No route to host
172.16.1.1 | SSH Authentication PROBLEM
Welcome to Ubuntu Server

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

-bash: line 1: 172.16.1.3: command not found
172.16.1.2 | SSH Authentication PROBLEM
wolf@linux:~$ 

这里有几个问题。

  1. 我只想获取身份验证状态,而不是登录服务器。

  2. 输出有问题-bash: line 1: 172.16.1.3: command not found

  3. 172.16.1.2 | SSH Authentication PROBLEM- 这是唯一安装了 SSH 的主机,而其他主机则没有。

期望的输出

wolf@linux:~$ ./sshSession.sh
172.16.1.1 | SSH Authentication PROBLEM
172.16.1.2 | SSH Authentication OK
172.16.1.3 | SSH Authentication PROBLEM

脚本有什么问题以及如何解决?

标签: bashssh

解决方案


您似乎假设exit将 写入ssh会话中,但这不是它的工作方式。您在进程终止exit后执行。ssh请参阅将命令作为输入传递给另一个命令(su、ssh、sh 等)

此外,您似乎正在将标准输入从while循环传递到正在运行的ssh实例中。请参阅Shell 脚本 while read line loop 在第一行之后停止

另外,为什么要测试“$”?查看命令是否成功,反模式?

此外,read -r用作一般原则(尽管我想这并不重要)。并且不要重复设置SSH_ASKPASS为相同的值。(并且通常不要export一个变量超过一次;它是无害的,但通常比你喜欢的更多地揭示你对export实际作用的理解。)并且,引用你的变量。

export SSH_ASKPASS='~/ePass'
while read -r host
do
    if setsid ssh -T -n user@"$host" true; then
        echo "$host | SSH Authentication OK"
    else
        echo "$host | SSH Authentication PROBLEM"
    fi
done < ip.txt

推荐阅读