0

マシンに ssh してコマンドを実行し、コマンドが完了する前に戻ることは可能ですか。

以下のbashスクリプトのスニペットで試してみました

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

ありがとう

更新:問題は、複数のマシンを更新していて、出力ストリームがnullに送信されるため、完了するまで機能するかどうかわかりません(機能するかどうかはわかりません)。代わりにスクリプトで tmux を使用することは可能ですか?

そのため、ssh で接続し、tmux を開始し、tmux シェルで更新を開始し、tmux シェルから切り離して、ssh セッションを閉じます。

その後、必要に応じて、いつでもいくつかのマシンに SSH で接続し、tmux シェルを再接続して、すべてが正常であることを確認できます。

-スクリプトで tmux を開始するにはどうすればよいですか? -スクリプトで tmux からどのようにデタッチしますか?

4

2 に答える 2

0

このために tmux を起動するのはやり過ぎです。それは可能です。ただし、標準のシェル構造を使用する方がよいでしょう。

オプションを使用し-nて ssh を実行すると、プロンプトが表示されたり、パスワードを要求されたりすることがなくなります。IP ごとに 1 つずつ、一連​​の既知のファイルに出力をリダイレクトします。スクリプトの並列実行を妨げないように、これらのファイルには適切なディレクトリを使用する必要があります (読者の演習)。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 に答える
0

コマンド全体を一重引用符で囲んでみてください。

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