Bashスクリプトを書くことは可能ですか?
これは技術的に可能ですか?
もちろんそれは可能です:
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
に保存する必要があります。
単一の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
を受け取ります。
単一の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 .