我需要通过 SSH 对服务器列表执行操作。
我正在使用 sshpass,该操作可能会失败,但它应该会发生几次,并且脚本仍应继续。
#!/bin/bash
while read address; do
echo -n "$address "
sshpass -p password ssh -o StrictHostKeyChecking=no user@$address 'ls /path/to/some/dir'
done < address-list
但是,该命令通过 ssh 在第一台主机上运行失败,并且脚本立即退出。
无论如何,我怎样才能让循环继续执行?在我的命令后添加退出并不能解决此问题,并且取消设置错误退出set +e
也不起作用。
答案1
ssh
将从循环继承标准输入流并从中读取尽可能多的内容,这意味着它将读取文件中的剩余行address-list
。由于ssh
正在从文件中读取剩余的行,因此循环只会执行一次迭代。从技术上讲,脚本不会提前终止或失败无论如何,它只是不做你想做的事。
为了避免这种情况,请使用ssh -n
来阻止ssh
从标准输入读取:
while read address; do
echo -n "$address "
sshpass -p password ssh -n -o StrictHostKeyChecking=no "user@$address" 'ls /path/to/some/dir'
done < address-list
ssh
以这种方式运行,以便您能够将数据传递到远程主机上启动的某个程序中,但正如您所发现的,在您的情况下,这将阻止您的循环正常运行。