マシンAから起動され、別のマシンにログインするbashスクリプトを作成することは可能ですか?
- マシンBby ssh(マシンAとBの両方がLinuxマシンになります)
- いくつかのファイルをマシンBにコピーします
- これらのマシンで指定されたpythonスクリプトを実行します。
- 結果をマシンAに転送します
- マシンBからログオフします。
これは技術的に実行可能ですか?
回答
もちろん実行可能です:
scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./
それだけです…
ただし、問題が1つあります。パスワードの入力を3回求められます。これを回避するには、sshキーを生成し、これらのキーでユーザーを承認します。
sshを生成するにはキーはssh-keygen -t rsa
を実行し、質問に答え、公開キーをリモートホスト(マシンB)の~/.ssh/authorized_keys
ファイルにコピーします。秘密キーは<に保存する必要があります。ローカルマシン上のdivid = "334398fac8">
(A)。
コメント
回答
すべてを実行できます単一のssh
接続/セッション:
ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst
これ:
- コピー
local_src
からremote_dst
、 -
command
を実行します -
remote_src
をlocal_dst
にコピーします。
ただし、command
はstdout
に書き込み、結果はlocal_dst
にもなります。 command
がstdin
からの入力を読み取ると、EOF
を受信します。
回答
これは単一のsshセッション内で実行できますが、ファイルのコピーと実行中のコマンドを組み合わせるのは少し注意が必要です。
このタスクに取り組む最も簡単な方法は、3つの操作に対して別々のSSHセッションを実行することです。
rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
これには、machineBへの認証を3回行う必要があります。複数回の認証を回避するための推奨される方法は、OpenSSHの最新バージョンで接続共有機能を使用することです。Bへのマスター接続を一度だけ開始し、SSHがそのマスター接続に自動的にピギーバックするようにします。 ControlMaster auto
とControlPath
の行を~/.ssh/config
に追加します。次に、バックグラウンドでマスター接続を開始し、タスクを実行します。
ssh -fN machineB # start a master connection in the background # Subsequent connections will be slaves to the existing master connection rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
scpoを使用するのではなくr rsyncを使用してファイルをコピーすると、リモートファイルシステムを SSHFS の下にマウントする方が簡単な場合があります。ちなみに、これでマスター接続の設定が処理されます(「上記のように~/.ssh/config
を設定したと仮定します)。
mkdir /net/machineB sshfs machineB: /net/machineB cp -Rp inputs /net/machineB/ ssh machibeB "some command -i inputs -o outputs" cp -Rp /net/machineB/outputs .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
ControlMaster=yes
とControlPath=/path/to/socketfile
<を定義することで、OpenSSH 'の接続プールをいつでも使用できます。 / div>をクリックし、-f
で1つのssh接続を開始してバックグラウンドsshを実行します。後続のすべてのSSH接続に同じソケットファイルを使用するように指示します。