終止從腳本呼叫的 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 )

您也可以在其他 shell 或更簡單的情況下使用$$而不是$BASHPID(如果您的 shell 沒有任何其他子程序)。

相關內容