所以我想知道為什麼我的一些自動化腳本中留下了一些掛起的 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 沒有任何其他子程序)。