是否可以在命令完成之前ssh进入机器,运行命令并返回。
我已尝试在下面的bash脚本片段中执行此操作
for ip in $ipaddrs
do
ssh pi@192.168.1.$ip 'sudo apt-get update' > /dev/null &
done
感谢
更新: 一个问题是我正在更新多台机器,并且当输出流被发送到null时,我不知道它是否有效(我不确定它是否会),直到它完成。是否可以在脚本中使用tmux?
so ssh in,启动tmux,在tmux shell中启动更新,从tmux shell分离并关闭ssh会话。
然后如果需要,我总是可以ssh到几台机器并重新连接tmux shell以检查一切是否正常。
- 你如何在脚本中启动tmux? - 你怎么在脚本中脱离tmux?
答案 0 :(得分:0)
尝试用单引号括起整个命令:
ssh pi@192.168.1.$ip 'sudo apt-get update > /dev/null &'
答案 1 :(得分:0)
为此启动tmux是过度的。可以办到;但你最好使用标准的shell结构。
您可以使用-n
选项ssh,以便它不会提示或要求输入密码。我们将输出重定向到一组已知文件,每个IP一个。您应该为这些文件使用适当的目录,以便它们不会干扰脚本的并行执行(练习阅读器)。我们并行运行ssh命令,并在所有ssh会话结束后解释结果。
# remove log files on termination
trap 'rm -f /tmp/sshlog-*.log' EXIT HUP
# loop
for ip in $ipaddrs
do
# use -n to redirect input appropriately, force public key to prevent password prompt.
ssh -o "preferredauthentications publickey" -n pi@192.168.1.$ip 'sudo apt-get update; echo "Exit Status: $?"' > /tmp/sshlog-${ip}.log 2>&1 &
done
# Wait for all the tasks to complete
wait
# check the exit statuses
for ip in $ipaddrs
do
exitcode=$(tail -1 /tmp/sshlog-${ip}.log | sed -n 's/Exit Status: //p')
# something went wrong/no exit status output
if [[ $exitcode != 0 ]]; then
echo "Error: Failed on $ip: " 1>&2
cat /tmp/$sshlog-${ip}.log 1>&2
fi
done