重複の可能性:
設定された SSH チャネルの使用
これは私の同期スクリプトです。
ssh [email protected] /etc/init.d/some_service stop
scp [email protected]:/var/some_service/events ./events
scp ./new_data [email protected]:/var/some_service/new_data
ssh [email protected] /etc/init.d/some_service start
ご覧のとおり、サービスを停止してscpを使用していくつかのコピーを実行してから、サービスを再起動してください。
問題は、4つの「類似した」SSH接続を連続的に「消費」することです。
1つの物理SSH接続を使用してすべての操作を実行する方法はありますか?
答え1
SSH 接続共有の使用を検討できます。
Host *.some-domain
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
ターゲットに一度だけ接続し、SSHプロセスをバックグラウンドに置くだけです。その後、別のコマンドを実行し、最後に最初のプロセスを終了します。
あるいは、SSH接続で複数のタスクをカプセル化してみることもできます。
たとえば、次のようなディレクトリがあるとします。
mycommands
|
+- run
+- new_data
その後、このデータをtarにパッケージ化してスクリプトに送信できます。
tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run'
これでrun
、スクリプトはすべての入力データにアクセスできるようになります(ここにはnew_data
例のデータのみがあります)。あなたの例に固執するために、 run
スクリプトは次のとおりです。
#!/bin/sh
BASE=`dirname $0`
/etc/init.d/some_service stop
cat /var/some_service/events
mv $BASE/new_data /var/some_service/new_data
/etc/init.d/some_service start
rm -rf $BASE
これでファイルを保存できますevents
。
tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run' >./events
より一般的には、run
スクリプトがtarを生成し、ssh
tarをパイプしてローカルで解凍することができます。
答え2
このロジックをターゲットサーバーで実行されているスクリプトに移動し、単一のSSHコマンドを使用して実行できます。おそらくこれは理想的ではありません。そうでなければそうしたでしょう:)
SSHマスター接続を使用すると、新しいSSH接続を開くコストを削減できます。これは、最初のSSHコマンドが通常どおりに新しい接続を開くことを意味します。同じサーバーへの後続の接続では、この既存の接続を再利用して3つの追加接続を作成するオーバーヘッドを節約します。
設定の良いガイドは次のとおりです。http://www.linuxjournal.com/content/speed-multiple-ssh-connections-same-server
答え3
これは、ローカルサーバーがリモートサーバーを信頼し、パスワードなしでコマンドを実行すると仮定します。それ以外の場合は、ヘッドレス接続を実行して入力を提供できないため、機能しません。
ssh remoteserver "/etc/init.d/some_service stop; scp /var/some_service/events localhost:${PWD}/events; scp localserver:${PWD}/new_data /var/some_service/new_data; /etc/init.d/some_service start"
上記のすべてのコードは、端末内の1つの連続した行になければなりません。あるいは、スクリプト内で実行している場合、これらはすべて改行で区切られず、1つのコマンドでなければなりません。
リモートサーバーからローカルサーバーへの信頼できるキーペアがある場合、これが機能しない理由はありません。