在 Shell 脚本中,SSH 连接仅适用于 CSV 文件中的第一行数据,其余服务器的命令失败

在 Shell 脚本中,SSH 连接仅适用于 CSV 文件中的第一行数据,其余服务器的命令失败

我的目标是验证 CSV 文件中的服务器列表登录是否成功。对于 SSH 密码、用户 ID 和 IP 地址,我通过 CSV 传递这些值。

并希望在每次成功 SSH 登录后捕获 SSH 连接输出的结果。

为此编写了一个 shell 脚本,但是我只看到 CSV 中第一个数据集的成功登录输出。对于其余服务器,SSH 命令失败。

脚本:

#!/bin/sh
INPUT=Test_data.csv
OLDIFS=$IFS
IFS=","
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read ip user pass
do
sshpass -p $pass ssh -n -t -t -o "StrictHostKeyChecking no" $user@$ip >> output.txt
wait
exit
done < $INPUT
IFS=$OLDIFS

输出:

Welcome to CYBER SECURITY
Cisco Codec Release ce 9.12.3 140cd8212ba 2020-04-17
SW Release Date: 2020-04-17
*r Login successful
OK
^[[?1034h10.xx.xx.xx,admin,432584
Command not recognized.
10.xx.xx.xx,admin,432584
Command not recognized.
10.xx.xx.xx,admin,432584
Command not recognized.
10.xx.xx.xx,admin,432584
Command not recognized.

答案1

简而言之:SSH shell 脚本才不是按照您期望的方式工作,这会导致您的脚本崩溃。

发生的事情是显而易见的:“第一个”SSH 连接已建立,从那时起,来自的所有内容都stdin被发送到 SSH 连接 - 思科不知道如何处理 CSV 行的“命令”。

ssh联机帮助页:

SYNOPSIS
     ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
         [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J destination] [-L address]
         [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
         [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command]

[command]一点是关键——如果你想在链接的另一端自动化某些操作,你必须指定它在同一命令行上或者它不是ssh命令的一部分。wait并且exit在你的脚本中永远不会被调用。

尝试将该行修改为

sshpass -p $pass ssh -n -t -t -o "StrictHostKeyChecking no" $user@$ip 'wait; exit' >> output.txt

看看这是否有效,尽管坦率地说,我建议将它们设置为安西布尔库存代替;它可能会帮你省去很多麻烦,因为这样你就可以运行ansible -m ping ciscos并得到一个可爱的摘要。

相关内容