1 つのセッションから SSH をコピーし、コマンドを実行します。

1 つのセッションから SSH をコピーし、コマンドを実行します。

重複の可能性:
設定された 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を生成し、sshtarをパイプしてローカルで解凍することができます。

おすすめ記事