Ssh

TTY 與普通文件有何不同?

  • July 29, 2019

我試圖理解ssh-t選項:

-t 強制偽終端分配。這可用於在遠端機器上執行任意基於螢幕的程序,這非常有用,例如在實現菜單服務時。多個 -t 選項強制分配 tty,即使 ssh 沒有本地 tty。

所以,TTY 是一個設備。引用 TTY 的一種方法是通過描述符(通過打開 TTY 設備獲得)。STDIN、STDOUT 和 STDERR 是描述符。但它們不一定指 TTY 設備。-t選項強制他們引用 TTY 設備。為了理解這個選項的作用,這是正確的推理方式嗎?

而 TTY 有什麼特別之處,用普通的 STDIN、STDOUT 和 STDERR 可能無法實現?

-t歡迎提供選項案例的範例。

通過哪種機制ssh分配該 TTY?ssh是在伺服器上還是在客戶端上創建新的 TTY ?如何檢查這個?(/dev/必須出現一個新節點或其他東西……)這個新的 TTY 如何與現有的 STDIN、STDOUT 和 STDERR 相關聯?

-t選擇力量

$$ the standard file descriptors $$指代 TTY 設備。為了理解這個選項的作用,這是正確的推理方式嗎?

否。該-t選項將在遠端電腦上執行命令,其 stdin/out/err 連接到偽 tty 從站而不是一對管道。

如果(a)沒有給出明確的命令並且(b) ssh客戶端的標準輸入本身就是一個 tty ,則在 pty 中執行它是預設設置。-t即使不滿足**(a)條件,您也需要一個強制 tty 分配,而當(b)不滿足時,其中****兩個**( ) 。-tt

ssh 通過哪種機制分配該 TTY?

通過一些系統依賴的機制。如今,它主要是master_fd = posix_openpt()遵循的標準slave_fd = open(ptsname(master_fd))

$$ 1 $$

ssh 是在伺服器上還是在客戶端上創建新的 TTY?

ssh 總是在****伺服器上創建新的偽終端,即在遠端機器上。如果在伺服器上分配了一個偽 tty,並且本地(客戶端的)標準輸入是一個 tty,則本地 tty 將被設置為原始模式。

如何檢查這個?(/dev/必須出現一個新節點或其他東西

不必要。/dev/pts但是在 2019 年的普通 linux 機器上,每個新的偽 tty下都會出現一個新文件。

這個新的 TTY 是如何與現有的 STDIN、STDOUT 和 STDERR 綁定的?

就像任何其他文件描述符一樣,使用dup2(slave_fd, 0),dup2(slave_fd, 1)dup2(newfd, oldfd)將關閉oldfd所引用的任何文件。如果分配了一個 pty,它也將成為遠端會話的控制 tty。

-t歡迎提供選項案例的範例。

ssh -t /bin/bash在您的登錄 shell 所在的系統上csh。如果省略-t,/bin/bash將在沒有提示、作業控制、行編輯功能等的情況下執行。

而 TTY 有什麼特別之處,用普通的 STDIN、STDOUT 和 STDERR 可能無法實現?

往上看 ;-)

與 tty 或其他類型的文件相比,管道不再是“普通”標準輸入。

$$ 1 $$它本身有很多問題(有多個 devpts 掛載和掛載命名空間),這就是為什麼將TIOCGPTPEERioctl 添加到 Linux 的原因,它返回一個引用從屬設備的 fd 而無需通過文件系統。

引用自:https://unix.stackexchange.com/questions/532674