我的目标是验证 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
并得到一个可爱的摘要。