SSHトンネルに動的に割り当てられたポートの保存

SSHトンネルに動的に割り当てられたポートの保存

もう一つありますここで素晴らしい質問と回答しかし、私は状況が異なります。

次のコマンドを使用してトンネルを作成します。

$ ssh -N -R 0:192.168.0.16:80 [email protected]
Allocated port 35007 for remote forward to 192.168.0.16:80

-f割り当てられたポートへの出力が表示されます。ただし、フラグをトンネルの背景として使用すると、出力がありませんstdout/strerr

この場合、リモートサーバーでいくつかのスクリプトを実行したり、次のソケットを使用せずにポートを知る方法はありますか?私が上にリンクした質問は

ありがとうございます!

答え1

-fフラグを使用しようとすると、そうでない場合に報告される可能性のある報告は防止されます。文書(man ssh、検索)を見ると、-f私たちが見ることができるものは

-fコマンドが実行される前に、要求はsshバックグラウンドに移動します。

しかし、次の段落では、私たちは読むことができます。

ExitOnForwardFailure設定オプションがに設定されている場合、起動されたyesクライアントは-fすべてのリモートポート転送が正常に設定されるのを待ってからバックグラウンドに配置します。

つまり、この設定がないと、コマンドはすぐにバックグラウンドに切り替わり、割り当てられたポートをユーザーに報告できません。

その結果、次のメッセージを報告する修正されたコマンドが生成されますAllocated port 1234 for remote forward to 192.168.0.16:80

ssh -o ExitOnForwardFailure=yes -fN -R 0:192.168.0.16:80 [email protected]

ただし、変数をキャプチャしようとすると、その内容が変数に書き込まれていることをすばやく識別できます。標準エラー代わりに標準出力。したがって、最終的な解決策は次のとおりです。

port=$(
    ssh -o ExitOnForwardFailure=yes -fN -R 0:192.168.0.16:80 [email protected] 2>&1 |
    awk '/Allocated/{print $3+0}'
)
[ -n "$port" ] && echo "Port $port was allocated"

次の出力を生成します。

Port 42655 was allocated

関連情報