这是以下问题的后续行动: Executing ssh command in a bash shell script within a loop
我正在做类似的工作:
while read line
do
ssh -n root@$line 'command'
do something
done
问题是我只想在前一个ssh行中完成'command'的执行时才执行“do something”部分,即我想等到后台ssh完成。 我可以使用睡眠,但这不适合我的应用。请指导我。
我不想特别在后台运行ssh。我只是这样做,以便我的循环正常运行。如Executing ssh command in a bash shell script within a loop中所述 如果我们不给-n标志,循环在第一次执行ssh命令后终止。
答案 0 :(得分:2)
如果您的命令未在后台运行,执行ssh server command
将等待该命令完成。例如,试试这个:
ssh server "sleep 3"
echo finished
这将在sleep 3
实际执行远程服务器后(即3秒后)打印“已完成”。
试试这个 - 在〜/ tmp中创建三个文件 - 称为行,parent.sh和child.sh。对于测试,请在运行sshd的某台计算机上进行测试,这样您就可以使用ssh localhost
代替ssh server
。把它放在其中:
行
line1
line2
line3
parent.sh
while read l; do
echo next line
ssh -n localhost "~/tmp/child.sh $l"
done < lines
echo parent
child.sh
echo child processing: $1
sleep 2
echo child done
当你运行父:
$ cd ~/tmp
$ ./parent.sh
输出将是:
next line
child processing: line1
child done
next line
child processing: line2
child done
next line
child processing: line3
child done
parent
表示在父级继续处理下一行之前执行子级。您将在“子处理”和“完成子项”行之间看到2秒的睡眠(在{。}}中执行{child}。)。
请注意sleep 2
不是为了在后台运行ssh -n
- 而是为了不使用stdin。要在后台运行ssh,可以使用ssh
- 请参阅ssh -f
。
答案 1 :(得分:0)
一点谷歌搜索帮助我:
while read line
do
ssh root@$line 'command' < /dev/null
do something
done
这样就不需要-n标志了。 更多细节: http://72.14.189.113/howto/shell/while-ssh/