既存のSSH接続を介してデータを転送するにはどうすればよいですか?

既存のSSH接続を介してデータを転送するにはどうすればよいですか?

何かに関する情報を得るために他のサーバーに接続する必要があるPHPスクリプトがあります。
私は現在ControlMaster autoこの目的のためにSSHを使用しており、うまくいきます。

しかし、問題は待ち時間が高すぎるということです。 80ミリ秒しかshell_execかかりませんssh example.com。これは、サーバー間の実際のレイテンシ(イーサネットケーブルを介して接続されるため、0.2ミリ秒)よりはるかに高いです。

だから今は簡単に考えてみたいです。既存のSSH接続を介したデータ転送新しいSSH接続を既存の接続に再利用する代わりに。

しかし、どうすればいいのかわかりません。データを渡すstdin最良の方法は何ですか?既存のSSHで接続example.comし、stdout結果出力を読み込みます。
(BASHソリューションはここでは大丈夫です。PHPに関連するものは必要ありません。)

ベストアンサー1

あなたがあなたControlMaster auto既存のTCP接続が再利用されました。しかし、TCP接続は依然として非常に迅速に確立されます。

80ミリ秒の遅延は、次の要因の組み合わせによって発生する可能性があります。

  1. phpはshell_exec新しいシェルを起動します(試してexecみますか?)
  2. 既存の接続を介して新しいSSHチャネルを確立する追加のオーバーヘッド
  3. 新しいSSHチャネルを介してリモートサーバーでコマンドを実行する

より速い応答が必要な場合は、まずそれぞれを個別に測定してから、遅い部分の遅延時間を短縮することをお勧めします。 #2が遅くなると、既存の永続SSHチャネルを介してコマンドを送信できます。名前付きパイプリモートコマンドを使用する繰り返し読みます(@symcbeanが提起した警告が適用されます)。

このような

mkfifo /tmp/f_in
mkfifo /tmp/f_out
tail -f /tmp/f_in | ssh [email protected] 'bash -c "while read name; do echo hello \$name; done"' > /tmp/f_out &
time response=$(head -n 1 /tmp/f_out & echo dwurf > /tmp/f_in); echo $response

これらのどれも、情報を照会できるWebサービスを作成するのと同じくらい高速ではありません。私もそれは非常に信頼できないだろうと予想した。

おすすめ記事