Linux上解决telnet失败问题
现象描述
在设备A执行telnetd,ps查看telnetd运行中。
在另一台设备B上telnet到这台设备上,报Connection closed by foreign host
在设备A上再查看telnetd进程状态,发现进程已经消失,说明在登录的过程中telnetd进程崩溃。
使用gdb挂载运行和attach运行,也没有任何线索。
查看telnetd命令,telnetd -F让其在前台运行。
发现在登录的瞬间会报“telnetd: can't find free pty”错误。
telnet登录失败的原因也就是这个。
解决问题
"can't find free pty" 错误,是由于系统无法分配伪终端(PTY)设备导致的。
第一步排查kernel是否支持,是否打开了PTY的相关配置。
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
发现正常。
第二步排查PTY设备数量,这个正常只会在登录设备过多的时候会被限制。
cat /proc/sys/kernel/pty/max # 查看当前系统PTY设备数量限制
cat /proc/sys/kernel/pty/nr # 当前已使用的PTY数量
发现也正常,数量剩余很多。
第三步检查/dev/pts文件系统
mount | grep pts
发现没有挂载信息,查看/dev/pts,甚至没有这个目录,那问题就在这里。
自己手动创建目录挂载。
再运行telnetd,检查telnet是否能登录
登录正常,问题解决。
telnetd -F -l /bin/sh &运行,可以免密root登录