既存の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サービスを作成するのと同じくらい高速ではありません。私もそれは非常に信頼できないだろうと予想した。

答え2

「静的」SSH接続がある場合、それを使用するためにPHPスクリプトインスタンスをどのように接続しますか?

まもなく私たちはロックセマンティクス(PHPで実装するのが難しい)について議論し始めました。その後、スケーリングの問題があります。各SSH接続は個別であるため、現在のソリューションのスケーラビリティが優れています。

今、両方のボックスで実行されるコードを制御すると仮定します。 sshを使用する理由がsshサーバーがいくつかの独自のコードを実行しているためである場合、ソリューションから多くのパターンが削除されます。

イーサネット経由で接続している場合は、ネットワークが信頼できると仮定する必要がありますか? rshのようなものを使用するとどうなりますか?

クライアントとサーバー間の権限の分離は重要ですか?

これはXYの問題のように聞こえます。

ここで唯一の実用的な解決策は次のとおりです。

1) オープン SSH 接続を維持し、SSH オーバーヘッドなしで localhost から接続するクライアントへの時間共有アクセスを提供する SSH クライアントで実行されるサーバーを作成します。これは些細なことでも拡張可能なものでもありません。

2)待ち時間の短いプロトコルと関連する認証/整合性/機密性を使用してクライアントとサーバーを実装します。これも小さな問題ではありません。そして、現在SSHの使用方法と理由を教えていません。

関連情報