0

是否可以 ssh 进入机器,运行命令并在命令完成之前返回。

我已经尝试在下面的 bash 脚本片段中执行此操作

for ip in $ipaddrs
do
    ssh pi@192.168.1.$ip 'sudo apt-get update' > /dev/null &
done

谢谢

更新:一个问题是我正在更新多台机器,并且由于输出流被发送到 null,我不知道它是否有效(我不确定它是否有效),直到它完成。是否可以在脚本中使用 tmux 代替?

所以 ssh in,启动 tmux,在 tmux shell 中启动更新,从 tmux shell 分离并关闭 ssh 会话。

然后如果需要,我总是可以 ssh 到几台机器并重新连接 tmux shell 以检查一切是否正常。

-如何在脚本中启动 tmux?- 你如何在脚本中与 tmux 分离?

4

2 回答 2

0

尝试用单引号将整个命令括起来:

ssh pi@192.168.1.$ip 'sudo apt-get update > /dev/null &'
于 2013-10-23T11:31:59.700 回答
0

为此启动 tmux 太过分了。可以办到; 但是你最好使用标准的 shell 结构。

您可以使用-nssh 选项,使其不提示或询问密码。我们将输出重定向到一组已知文件,每个 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
于 2013-10-23T15:06:57.063 回答