Bash 脚本因命令失败而退出 (sshpass)

Bash 脚本因命令失败而退出 (sshpass)

我需要通过 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以这种方式运行,以便您能够将数据传递到远程主机上启动的某个程序中,但正如您所发现的,在您的情况下,这将阻止您的循环正常运行。

相关内容