TTY 與普通文件有何不同?
我試圖理解
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 掛載和掛載命名空間),這就是為什麼將
TIOCGPTPEER
ioctl 添加到 Linux 的原因,它返回一個引用從屬設備的 fd 而無需通過文件系統。