
bashスクリプトを書くことはできますか?
- マシンAで起動し、SSHを介して別のマシンBにログインします(マシンAとBはどちらもLinuxマシンです)。
- 一部のファイルをシステムBにコピーする
- このマシンで指定されたPythonスクリプトを実行します。
- 結果をマシン A に戻します。
- コンピュータ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
これ:
local_src
にコピーremote_dst
,- 実装する
command
, remote_src
にコピーlocal_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 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 .