web-dev-qa-db-ja.com

sshをコピーして1つのセッションでコマンドを実行する

重複の可能性:
すでに確立されている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接続を使用してすべての作業を行う方法はありますか?

21
Arenim

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にパイプしてローカルで解凍することができます。

25
ithkuil

このロジックを移行先サーバーで実行されるスクリプトに移動し、1つのSSHコマンドで実行できます。おそらくこれは理想的ではありませんが、それ以外の場合はすでにそうしているでしょう:)

SSHマスター接続を使用して、新しいSSH接続を開くコストを軽減できます。これは、最初のSSHコマンドが通常どおりに新しい接続を開くことを意味します。同じサーバーへの後続の接続では、この既存の接続が再利用されるため、3つの追加接続を作成するオーバーヘッドを節約できます。

これを設定するための良いガイドがここにあります: http://www.linuxjournal.com/content/speed-multiple-ssh-connections-same-server

4
Mike Ryan

これは、ローカルサーバーがリモートサーバーを信頼してパスワードなしでコマンドを実行することを前提としています。それ以外の場合は、いわゆるヘッドレス接続を実行しているため、入力を提供する方法がないため機能しません。

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つのコマンドにする必要があります。

リモートサーバーからローカルサーバーへの信頼できるキーペアがある場合、これが機能しない理由はわかりません。

1
MelBurslan