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


11

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

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

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

回答:


15

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

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

以上です...

しかし、1つの問題があります。パスワードを3回要求されます。これを回避するには、sshキーを生成し、これらのキーによってユーザーを認証します。

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


公開鍵にオプションがない場合は、次のようなパスワードプロンプトを最小限に抑えるために粗雑なことを行うことができますcat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Patrick

パスワードを使用したい場合は、とを定義してOpenSSHの接続プールを常に使用ControlMaster=yesControlPath=/path/to/socketfile、で1つのssh接続を開始し-fて、バックグラウンドsshを実行できます。同じソケットファイルを使用するように、後続のすべてのSSH接続に通知します。
jsbillings 2012年

4

私は単一のssh接続/セッションですべてを行うことが可能です:

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

この:

  1. コピーlocal_srcremote_dst
  2. 実行command
  3. にコピーremote_srclocal_dstます。

しかし、上にcommand書いたstdout場合、結果もにありますlocal_dst。場合はcommand、入力をから読み込んで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 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 .
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.