スクリプトから呼び出されたSSH終了(SIGPIPE処理?)

スクリプトから呼び出されたSSH終了(SIGPIPE処理?)

そのため、自動化スクリプトの一部でSSH接続が中断されたままになる理由が疑問に思います。そして奇妙な問題に直面するようになります。 SSHは、PTYなしで使用されている場合、出力パイプが閉じられても終了しません。 。これはここの他のいくつかの質問で議論されていますが、適用される答えは見つかりませんでした。いくつかは-tオプションの使用を提案しましたが、PTYが必要で、パイプは機能しません。

とにかく、問題を以下の最小限の例に縮小しました。

#this works
cat /dev/zero |false

#this never terminates
ssh user@host "cat /dev/zero" |false

SSHがSIGPIPEがデッドパイプ(エラーを引き起こすパイプ)に書き込めないように無視する理由、またはそれを正しく「動作」させる方法についての説明はありますか?

SIGPIPE をリモートホストに「リレー」する必要はありません。単純にsshクライアントを終了すると(SIGPIPEが無視されない場合に発生する現象)、結果は同じですが、複雑さが少なく、いくつかの「より正確です」と仮定します。

あなたの考えに感謝します!

-mk

編集する:Sun_SSHサーバーでのみ発生し、文書化されていない問題のようです。良い解決策を探しています。

ベストアンサー1

私の質問に答えるには:これはSun SSHの既知の問題です。私が見つけた最善の解決策は、出力で "Sun_SSH"を検出し、ssh -V次のように適用することです。

#!/bin/bash
# ....
( ssh host 'localCommand' | remoteCommand || pkill -P $BASHPID )

他のシェルまたはより単純な状況(シェルに他のサブプロセスがない場合)で$$代わりに使用することもできます。$BASHPID

おすすめ記事