重複の可能性:
すでに確立されている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接続を使用してすべての作業を行う方法はありますか?
Ssh接続共有の使用を検討できます。
Host *.some-domain
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
宛先に1回だけ接続し、sshプロセスをバックグラウンドで実行します。次に、他のコマンドを実行し、最後に最初のプロセスを強制終了します。
別の方法として、一連のアクションを1つの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にパイプしてローカルで解凍することができます。
このロジックを移行先サーバーで実行されるスクリプトに移動し、1つのSSHコマンドで実行できます。おそらくこれは理想的ではありませんが、それ以外の場合はすでにそうしているでしょう:)
SSHマスター接続を使用して、新しいSSH接続を開くコストを軽減できます。これは、最初のSSHコマンドが通常どおりに新しい接続を開くことを意味します。同じサーバーへの後続の接続では、この既存の接続が再利用されるため、3つの追加接続を作成するオーバーヘッドを節約できます。
これを設定するための良いガイドがここにあります: http://www.linuxjournal.com/content/speed-multiple-ssh-connections-same-server
これは、ローカルサーバーがリモートサーバーを信頼してパスワードなしでコマンドを実行することを前提としています。それ以外の場合は、いわゆるヘッドレス接続を実行しているため、入力を提供する方法がないため機能しません。
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つのコマンドにする必要があります。
リモートサーバーからローカルサーバーへの信頼できるキーペアがある場合、これが機能しない理由はわかりません。