
以下を参照してください。
## Does NOT return to the shell, but Ctrl-C can exit
ssh -S none -fNR 13018:localhost:22 example.com | cat
## Returns to the shell (no "-S none")
ssh -fNR 13019:localhost:22 example.com | cat
## Returns to the shell (no "| cat")
ssh -S none -fNR 13020:localhost:22 example.com
最初のコマンドがシェルに返されないのはなぜですか?他のシェルのようにシェルに戻りたいです(例:-f
コマンドが実行される前にSSHにバックグラウンドに入るように要求します。)は私が提供した3つの例にあり、出力をリダイレクトするときに異常に動作するようです(ここでは、で示されています| cat
)。これは-S none
関連オプションではありませんが(特に-S none
ControlMasterオプションが設定されていないため、これがデフォルトの動作である必要があるため)、まだ変更されているようです-f
。
最後のコマンドのstdout / stderrをキャプチャし、そのコマンドが出力に従って応答できるようにシェルに返すようにする方法はありますか?
完全な話:
SSHトンネルを実行したいです。失敗した場合は、使用しているポートに関連していることを確認してください。この場合、別のポートを試してみましょう。一意ではないため、エラーレベルは使用できず、stderrをキャプチャしようとすると明確に動作しないsshを実行します。偽物のようにも見えます(-S none
使用するものと使用しないものの間に何もないはずです。違いは次のとおりです。デフォルトの場合は、私の~/.ssh/config
値が空で、関連するオプションが設定されて/etc/ssh/ssh_config
いないことを確認しましたControlMaster
。)
編集する:
- 説明された2番目の例を再現できないようです。時々プロセスは
ssh
終了しますか?今後時々後ろにcat
プロセスがパイプを開くか?
答え1
奇妙なことに、私が理解していないのは、2番目の例がシェルに返される理由です(再現できません)。
SSHプロセスは実行中にバックグラウンドに残りますssh -S none -fNR 13018:localhost:22 example.com | cat
。それでもパイプの書き込み側が開いています。したがって、cat
ファイルの終わりは標準入力に表示されないため、読み続けます。
Ctrl+を押してプロセスをC終了しますcat
(バックグラウンドSSHプロセスが独自のプロセスグループに移動され、フォアグラウンドSSHプロセスが分岐すると終了するため、これはまだ実行中のタスクの唯一の部分です)。バックグラウンドsshプロセスが標準出力に書き込みを試みると、EPIPEは書き込みに-N
失敗します(sshはSIGPIPEをブロックします)。バックグラウンドSSHプロセスを終了すると、そのcat
プロセスも終了します。