控制伪终端 (/dev/pts/*) 分配

Jer*_* T. 3 terminal-emulator udev

有没有办法控制给出连接的伪终端(/dev/pts/*)?例如,我有多个瘦客户端,每个瘦客户端都通过 SSH 运行与 RHEL 服务器的单独终端会话,我想配置一些东西,以便瘦客户端 A 始终分配为 /dev/pts/7,而瘦客户端 B 始终分配为 /dev/pts /8。我一直在尝试创建 udev 规则,但是当我针对终端 ID 运行 udevinfo 时,它只返回“无法获取类设备”,如果设备实际上未在 udev 中分类,我不确定如何创建规则.

Gil*_*il' 5

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/ptyNUM/dev/ttyNUMHAVE_DEV_PTMX

我强烈建议不要这样做:这是一种非标准配置,需要您编写一些额外的代码。这是额外的维护工作和安全风险。

反正我看不出重点。您可以运行last以查看每个终端上当前登录的客户端。