web-dev-qa-db-ja.com

ネストされたsshコマンド転送

一般的に、私はリモートコンピュータでオーディオをリアルタイムで聞くことができます:

ssh me@gate rec -t mp3 - | play -

例えばgateという名前のコンピューターで、コマンドrec(またはsox)を実行すると、オーディオストリームがネットワーク経由で転送されるため、play(またはsox)コマンドを使用してリアルタイムで再生できます。

これは問題なく機能します。特に、ノートブックからgateにパスワードなしでアクセスできるためです(authorized_keys & authorized_keys2を使用)。

しかし、私のトポロジーは次のとおりです。

+----+  internet   +------+  lan   +----------+
| my | ----------> | gate | -----> | internal |
+----+             +------+        +----------+

rec compでinternalを実行する必要があり、stdoutplayコンピューターのmyコマンドにパイプする必要があります。

したがって、sshsをカスケード(ネスト)すると、次のようになります。

ssh -t me@gate ssh me@internal rec -t mp3 -

ssh-tに注意してください)

  • したがって、gateはパスワードなしでアクセスされます
  • gateで、2番目の(ネストされた)sshが実行されます
  • したがって、internalは私にパスワードを要求します(-t
  • パスワードを入力すると、internalrecコマンドを正しく開始します
  • そして、受信したバイナリデータガベージをローカル端末で見ることができました。

残念ながら、これはplayにパイプしようとすると機能しません。この

ssh -t me@gate ssh me@internal rec -t mp3 - | play -

Password:文字列がリダイレクトされ(たとえば、パスワードの入力を求められなかった)、playが混乱したため、機能しません。

me@gate-> me@internalの間にパスワードなしのアクセスを設定すると、おそらく問題は解決する可能性がありますが、私はしたくないこれ-internalにパスワードを手動で入力したいcomp。

これを解決する方法はありますか?

2
cajwine

internalは標準の22ポートでリッスンしていると思います。

最初にトンネルを構築します。

ssh -N -L localhost:2222:internal:22 me@gate
# you can put it to background with &

次に、トンネルを介して接続します。この接続は最終的にinternalになります。

ssh -p 2222 me@localhost rec -t mp3 - | play -

パイプが使用されているにもかかわらず、internalへのパスワードの入力を求められるはずです。


ssh -L …別の質問に対する私の答え で説明されています。

1

ラップトップがinternalに直接アクセスできる場合、パスワードプロンプトが邪魔にならないのではないでしょうか。

その場合は、ProxyCommand構成オプションを試してみてください。

このようなものを~/.ssh/configに入れてください

Host internal-via-gate
    User me
    Hostname internal
    Port 22
    ProxyCommand ssh gate nc %h %p

これにより、直接接続しているかのように、ssh internal-via-gateを簡単に実行できるようになります。


そうでない場合は、ポート転送を検討してください。

Host internal-via-gate
    User me
    Hostname internal
    Port 22
    ProxyCommand ssh gate nc %h %p
    LocalForward 27015 localhost:27015

次に、接続して認証します(ssh internal-via-gate)。

ログインしたら、次のコマンドを実行します。

  • リモートのrec -t mp3 - | nc -l 27015、および
  • ローカルマシンのnc localhost 27015 | play -
0
Attie