2013-05-30 82 views
3

當使用-T和-t運行相同的ssh命令時,任何stderr輸出都分別到達stderr和stdout。爲什麼OpenSSH RequestTTY會導致stderr重定向到stdout?

無PTY分配: ssh -T [email protected] "echo >&2 foo" 1>/tmp/out 2>/tmp/err

輸出寫入/tmp/err

隨着PTY分配:ssh -t [email protected] "echo >&2 foo" 1>/tmp/out 2>/tmp/err

輸出現在會被寫入/tmp/out

我有點理解,用pty模擬完整的僞屏幕,並且輸出處於原始模式。發送到屏幕的輸出然後通過stdout發送回ssh,並且ssh的tty也被設置爲原始模式。有人可以請進一步解釋嗎?

回答

6

tty沒有單獨的輸出和錯誤通道。只有一個輸出通道;無論你寫給它什麼,只要到CRT,串口,終端窗口,調制解調器,打印機或任何連接到tty的東西。

當分配tty來運行一個命令時,ssh理論上可能會將命令的標準輸入和標準輸出附加到tty,而將命令的標準錯誤附加到與tty完全分離的單獨標準錯誤通道(管道) 。然而,這與慣例不一致,即運行在tty上的命令應該將其所有3個stdio通道連接到同一個tty,並且某些命令可能會混淆或行爲不同。所以ssh選擇遵循慣例。

不是使用tty時,ssh可以自由地將命令的stdin,stdout和stderr附加到3個單獨的單向管道。

+0

這就是我想的,謝謝你的解釋。所以stdout和stderr被髮送到tty。我讀過一些地方,當這種情況發生時,調用ssh有一個tty(pty),然後它被放入原始模式。我不再記得有關煮熟與原始模式的所有細節。任何人都可以進一步闡明? – gabor

+2

是的,本地tty(在客戶端)被置於原始模式,因爲遠程pty(ssh分配給註釋的那個)處於熟化模式,您只需要/希望其中一個進行熟化處理。 ..或者如果在遠程系統上運行的應用程序有目的地將(遠程)tty置於原始模式,那是因爲它是一個詛咒/全屏幕/任何應用程序*期望*原始模式一直到用戶。所以,本地tty應該是純粹的。 – Celada

相關問題