SSHコマンドを使用して複数のコンピュータを接続し、同時に各コンピュータに異なるコマンドを送信する方法

SSHコマンドを使用して複数のコンピュータを接続し、同時に各コンピュータに異なるコマンドを送信する方法

さまざまなプログラムを実行するには、複数のコンピュータを接続する必要があります。コンピュータごとに異なるコマンドを送信する必要があります。 sshコマンドを使用して複数のコンピュータを接続し、各コンピュータに異なるコマンドを送信する方法は?各コンピュータに対してプログラムを実行するコマンドは nohup Rscript program_i.R > program_i_out.txt。より具体的に説明してください。 3つのコンピュータを使って3つのプログラムを実行したいです。だから私が送るよ

nohup Rscript program_1.R > program_1_out.txt最初のコンピュータとして、

nohup Rscript program_2.R > program_2_out.txt2台目のコンピュータで、

nohup Rscript program_3.R > program_3_out.txt3台目のコンピュータで。

答え1

努力するssh -f user@host '<your command here>'

SSHのマニュアルページから:

-f Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background.

たとえば、これを行うとssh -f <my computer> 'echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!"印刷されますhello 1 person in ssh!

2を印刷した後、セッションは自動的に終了しますが、終了するのを待つ必要はありません。これにより、ssh -f <my computer> 'sleep 30 && echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!"'何も起こらないように見え、正常にすべての操作を実行できますが、30秒後にはhello 1 person in ssh!

リダイレクトを使用すると、>すべての標準出力がファイルにリダイレクトされますが、すべてのエラーは依然として画面に印刷されます。これを防ぐには、&>すべての出力(stdoutとstderr)をファイルにリダイレクトする方法を使用できます。

答え2

SSHはいくつかの方法で呼び出すことができます。人々がそれを呼ぶ最も一般的な方法は次のとおりです。

ssh user@host

これで対話型端末が開きます。しかし、SSHでは実際には次のような呼び出し方法があります。

ssh user@host /usr/bin/foo

したがって、最初のタイプは基本的にbashを接続して実行するので便利です。デフォルトでは、次の操作を行います。

ssh user@host sh

shこのシステムのエンクロージャはどこにありますかbash

議論のために実行する必要があるコマンドがあるとしましょうmycommand

(これを単純化する理由は、例として提供されたコマンドにnohup出力リダイレクトが含まれているためです。つまり、コマンドを正しくエスケープする必要があることを意味します。)また、nohupSSH接続が終了した後でもコマンドを維持するのが難しい場合はsetsid、使用してセッションリーダーにしたい場合があります。両方の場合&)を使用して非同期コマンドにします。

コンピュータごとに異なるコマンドを送信する必要があります。

これを行う方法を指定していません。例えば、機械は始めるSSH接続によって実行されるコマンドが決まりますか、それともリモートシステムの設定によって指定されますか?

さまざまなリモートコンピュータへの接続を開始するコンピュータが作成するコマンドを決定する必要がある場合は、その情報をどこかに保存して使用する必要があります。

これを達成する1つの方法は、基本的に以下を呼び出すので、データをSSHにパイプすることですbash

cat command.txt | ssh user@host

cat comand.txt今、私はその情報を保存する方法がわからないので、SSHに送信する必要があるコマンドを生成するためにここの例を使用しています。次のように、すべての情報をテキストファイルに保存するのが最も簡単な方法です。

user  host  command
user2 host2 command2
user3 host3 command3

sedこれでこれを行うためのパイプラインを作成できます。しかし、もう少し複雑です(または同じパーサーを使用する必要がありますawk)。 PerlやPHPなどの軽いスクリプト言語を使用する方が簡単かもしれません。

<?php

foreach (file('myfile.txt') as $line) {
    list($user, $host, $command) = explode(' ', $line);
    passthru("ssh $user@$host $command");
}

関連情報