如何ssh到一台机器,运行命令并在命令完成之前返回

时间:2013-10-23 11:26:56

标签: ssh

是否可以在命令完成之前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?

2 个答案:

答案 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