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

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

有什么方法可以控制给定哪个伪终端(/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_opendrivers/tty/pty.c,这要求devpts_new_indexfs/devpts/inode.c,它使用ida_get_newlib/idr.c。这恰好会返回第一个可用的数字,但不能保证它总是会这样做。)

C API 和内核 API 都不允许伪终端的创建者传递会影响结果的参数。

可以通过使用生成(master) 和(slave) 形式的 pty 的旧 BSD API 来获取静态 pty。这至少需要重新编译 SSH 服务器,而无需配置设置来强制其使用 BSD 样式的 pty。您需要注意权限,但如果 SSH 是唯一的用户,则可能会更容易一些。然后,您需要修补 OpenSSH 以添加某种机制来将特定的 pty 编号与特定的客户端绑定。/dev/ptyNUM/dev/ttyNUMHAVE_DEV_PTMX

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

无论如何,我不明白这一点。您可以运行last来查看当前在每个终端上登录的客户端。

相关内容