web-dev-qa-db-ja.com

何かをするために別のマシンにログインするbashスクリプトを書く方法は?

Bashスクリプトを書くことは可能ですか?

  1. マシンAから起動し、sshによって別のマシンBにログインします(マシンAとBの両方がLinuxマシンになります)。
  2. 一部のファイルをマシンBにコピーします
  3. これらのマシンでpythonスクリプトを与えられたpythonスクリプトを実行します。
  4. 結果をマシンAに転送します
  5. マシンBからログオフします。

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

11
Aufwind

もちろんそれは可能です:

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ファイルにコピーします。秘密鍵は、ローカルマシン(A)の~/.ssh/id_rsaに保存する必要があります。

15
pbm

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

ただし、commandstdoutに書き込む場合、結果もlocal_dstcommandstdinから入力を読み取ると、EOFを受け取ります。

4
jfg956

単一の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 autoControlPath行を~/.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 .