Udev

控制偽終端 (/dev/pts/*) 分配

  • November 2, 2015

有什麼方法可以控制給定連接的偽終端(/dev/pts/*)嗎?例如,我有多個瘦客戶端,每個瘦客戶端都通過 SSH 執行與 RHEL 伺服器的單獨終端會話,我想配置一些東西,以便始終為瘦客戶端 A 分配 /dev/pts/7 而瘦客戶端 B 始終為 /dev/pts /8。我一直在嘗試創建一個 udev 規則,但是 udevinfo 僅在我針對終端 ID 執行它時返回“無法獲取類設備”,如果設備實際上未歸類在 udev 中,我不確定如何創建規則.

Linux 通常使用 Unix 98 偽終端介面。中的條目/dev/pts是在應用程序控制之外分配的。一個想要創建偽終端(這裡是 SSH 伺服器)的應用程序打開/dev/ptmx,它分配一個偽終端並返回一個文件描述符給它。/dev/pts/分配偽終端時確定的偽終端號(後面的數字);它與核心資料結構中偽終端的索引相關聯。

(如果你很好奇,核心程式碼是ptmx_openin drivers/tty/pty.c,它呼叫devpts_new_indexin fs/devpts/inode.c,它使用ida_get_newin lib/idr.c。這恰好返回第一個可用的數字,儘管不能保證它總是會這樣做。)

C API 和核心 API 都不允許偽終端的創建者傳遞會影響結果的參數。

可以通過使用產生(master) 和(slave) 形式的 pty 的遺留 BSD API 來獲得靜態 pty。這至少需要在沒有配置設置的情況下重新編譯 SSH 伺服器以強制它使用 BSD 樣式的 ptys。您需要注意權限,但如果 SSH 是唯一的使用者,它可能會更容易一些。然後你需要修補 OpenSSH 以添加一些機制來將特定的 pty 號碼綁定到特定的客戶端。/dev/pty*NUM*``/dev/tty*NUM*``HAVE_DEV_PTMX

我強烈建議不要這樣做:這是一種非標準配置,需要您編寫一些額外的程式碼。這是額外的維護工作和安全風險。

反正我看不出重點。您可以執行last以查看每個終端上目前登錄的客戶端。

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