有什么方法可以控制给定哪个伪终端(/dev/pts/*)连接?例如,我有多个瘦客户端,每个瘦客户端都通过 SSH 运行与 RHEL 服务器的单独终端会话,我想进行一些配置,以便瘦客户端 A 始终分配为 /dev/pts/7,瘦客户端 B 始终分配为 /dev/pts /8。我一直在尝试创建 udev 规则,但当我针对终端 ID 运行 udevinfo 时,它仅返回“无法获取类设备”,如果设备实际上未在 udev 中分类,我不确定如何创建规则。
答案1
Linux 通常使用 Unix 98 伪终端接口。中的条目/dev/pts
是在应用程序控制之外分配的。想要创建伪终端(此处为 SSH 服务器)的应用程序打开/dev/ptmx
,它分配一个伪终端并向其返回一个文件描述符。/dev/pts/
分配伪终端时确定的伪终端号( 后面的数字);它与内核数据结构中伪终端的索引相关联。
(如果你好奇的话,内核代码是ptmx_open
在drivers/tty/pty.c
,这要求devpts_new_index
在fs/devpts/inode.c
,它使用ida_get_new
在lib/idr.c
。这恰好会返回第一个可用的数字,但不能保证它总是会这样做。)
C API 和内核 API 都不允许伪终端的创建者传递会影响结果的参数。
可以通过使用生成(master) 和(slave) 形式的 pty 的旧 BSD API 来获取静态 pty。这至少需要重新编译 SSH 服务器,而无需配置设置来强制其使用 BSD 样式的 pty。您需要注意权限,但如果 SSH 是唯一的用户,则可能会更容易一些。然后,您需要修补 OpenSSH 以添加某种机制来将特定的 pty 编号与特定的客户端绑定。/dev/ptyNUM
/dev/ttyNUM
HAVE_DEV_PTMX
我强烈建议不要这样做:这是一个非标准配置,需要您编写一些额外的代码。这是额外的维护工作并且存在安全风险。
无论如何,我不明白这一点。您可以运行last
来查看当前在每个终端上登录的客户端。