タスクを実行するために別のシステムにログインするbashスクリプトを作成する方法は?

タスクを実行するために別のシステムにログインするbashスクリプトを作成する方法は?

bashスクリプトを書くことはできますか?

  1. マシンAで起動し、SSHを介して別のマシンBにログインします(マシンAとBはどちらもLinuxマシンです)。
  2. 一部のファイルをシステムBにコピーする
  3. このマシンで指定されたPythonスクリプトを実行します。
  4. 結果をマシン A に戻します。
  5. コンピュータBからログアウトします。

これは技術的に可能ですか?

答え1

もちろん可能です:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

それはすべて...

しかし、問題があります。パスワードを3回入力するように求められます。これを回避するには、SSHキーを生成し、このキーを使用してユーザーに権限を付与できます。

SSHキーを生成するには、を実行してssh-keygen -t rsa質問に答え、リモートホスト(コンピュータB)の公開鍵を~/.ssh/authorized_keysファイルにコピーします。秘密鍵は~/.ssh/id_rsaコンピュータ(A)にローカルに保存する必要があります。

答え2

ssh単一の接続/セッションですべての操作を実行できます。

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

これ:

  1. local_srcにコピーremote_dst,
  2. 実装するcommand,
  3. remote_srcにコピーlocal_dst

しかしcommand、それを書き留めてみるとstdout結果が出ますlocal_dstcommand入力をから読むと合計stdinを受け取りますEOF

答え3

単一の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/

scp または 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 .

関連情報