web-dev-qa-db-ja.com

SSHを介してコマンドを実行し、接続を開いたままにする方法は?

私が走るとき

FOO=$(ssh -L 40000:localhost:40000 [email protected] cat /foo)

/fooの内容を取得しましたが、切断されます。

私がしたいことは、何とか/fooのコンテンツを取得し、ポート40000が同じサーバーに転送されるように接続を開いたままにすることです。これは可能ですか?

あなたは尋ねるかもしれません、なぜこのように2つのssh接続を発行しないのですか?

FOO=$(ssh [email protected] cat /foo)
ssh -L 40000:localhost:40000 [email protected] -f -N

私の状況では、これを行うことができない理由は、ip(1.2.3.4)が多数のランダムなバックエンドに接続を転送するロードバランサーであるためです。 1.2.3.4にsshするたびに、異なるマシンを取得します。/fooの内容は、マシンごとに異なります。さらに、転送ポート(40000)を介して送信するデータは、/fooの内容によって異なります。マシンAで/fooの内容を取得し、ポート40000を介してマシンBにデータを送信すると、動作しません。

7
Jesse Shieh

あなたが説明しているものは、SSH多重化として知られています。

私はそのセットアップをdevops設定で使用して、VMへの接続をキャッシュします。

このようにして、新しい接続ごとにSSH接続全体を再ネゴシエート(およびユーザーを認証)せずに、同じ接続を最大30分間再利用します/接続をキャッシュします。

(複数の)コマンドを続けてVM /サーバーに送信すると、速度が大幅に向上します。

設定はクライアント側で行われ、30分のキャッシュの場合、/etc/ssh/ssh_configで次のように設定できます。

ControlPath ~/.ssh/cm-%r@%h:%p
  ControlMaster auto
  ControlPersist 30m

MaxSessionsパラメータも、ssh_configにあり、同時に接続できる多重化接続の数を定義します。デフォルト値は10です。より多くの同時キャッシュ接続が必要な場合は、変更することができます。

たとえば、最大20のキャッシュされた接続の場合:

MaxSessions 20

詳細については、 OpenSSH/Cookbook/Multiplexing を参照してください

SSH多重化の利点は、新しいTCP接続を作成するオーバーヘッドが排除されることです。
...
2番目以降の接続では、確立されたTCP接続が繰り返し再利用され、新しいSSH接続ごとに新しいTCP接続を作成する必要はありません。

SSH多重化の使用も参照してください

SSH多重化は、単一のTCP接続で複数のSSHセッションを実行する機能です。

多重化しない場合、そのコマンドが実行されるたびに、SSHクライアントは新しいTCP接続とリモートホストとの新しいSSHセッションを確立する必要があります。多重化を使用すると、特定の期間存続する単一のTCP接続を確立するようにSSHを構成でき、その接続を介してSSHセッションが確立されます。これにより、速度が向上し、リモートSSHホストに対してコマンドを繰り返し実行した場合に加算される可能性があります。

最後に、多重化によってクライアントとサーバー間のTCP接続が開いたままになるため、キャッシュが開いているかアクティブである限り、ロードバランサー内の同じマシンと通信していることが保証されます。

8
Rui F Ribeiro

それを行うには複数の方法があります、あなたが試すことができる1つは

 ssh -fT -L 40000:localhost:40000 [email protected] 'sleep 60'
 FOO=$(ssh root@localhost -p 40000 cat /foo)

残りは続けることができます...

ここで、-fはバックグラウンドに配置し、-Tはtty割り当てを無効にします。 sleepコマンドを使用してセッションを60秒間アクティブに保ち、それ自体を終了できるようにするには、セッションを変更するか、他の方法で構成します。

たとえば、単純なものは、ファイル/tmp/a.txtが見つかるまでセッションを存続させます。作業が終了したら、ファイルを作成します。一方、ループはそれを見て、クリーンアップrm/tmp/aを実行します。 .txtし、セッションを終了します。

ssh -fT -L 40000:localhost:40000 [email protected] 'while [[ ! -f /tmp/a.txt ]] ; do sleep 2 ; done ; rm /tmp/a.txt'
FOO=$(ssh root@localhost -p 40000 cat /foo)
do you work..
ssh root@localhost -p 40000 touch /tmp/a.txt

あなたはそれを生かしておくためにより適した他のどんな条件も使うことができます。

2
Bharat