回答:
もちろんそれは可能です:
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)に保存する必要があります。
ControlMaster=yes
しControlPath=/path/to/socketfile
、で1つのssh接続を開始し-f
て、バックグラウンドsshを実行できます。同じソケットファイルを使用するように、後続のすべてのSSH接続に通知します。
単一の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 .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results