如何强制 telnetd 接受 TERM 变量中的任意数据?

如何强制 telnetd 接受 TERM 变量中的任意数据?

我需要使用以下语法在 TERM 变量内部传输附加数据:

TERM=xterm:VAR1=data1:var2=data2:...

在服务器端,这些数据被分解为实际变量。但是,Debian 的 telnet 服务器正在关闭 TERM 变量具有“:”或附加“=”的连接。

Debian 是:

# uname -a
Linux server 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u2 (2016-01-02) x86_64 GNU/Linux

有没有办法将服务器设置为不检查 TERM 变量中的不常见字符?

编辑 - 注意:

这是在 SCO 和 AIX 之间以这种方式工作的遗留环境。现在我们需要添加一个 Linux 服务器,该服务器应接受 TERM 变量中的任意数据。

答案1

这是一个经过深思熟虑的安全选择。不过,您可以将 telnetd 服务器配置为传递该TERM变量,但其值将转换为小写。实际检查合法TERM值不是由其本身完成的,而是由服务器调用的in.telnetd登录程序完成的。telnetlogin您可以将 telnetd 服务器配置为运行其他一些登录程序,例如中间 shell 脚本,该脚本将在继续登录之前解开变量。例如,要测试这一点,请创建/tmp/mytelnetlogin包含以下内容的文件:

#!/bin/bash
export MYTERM=$TERM
export TERM=dumb
exec /usr/lib/telnetlogin "$@"

并执行chmod +x它。然后在端口 9999 上运行您自己的 telnetd 测试版本:

sudo sudo -u telnetd /usr/sbin/in.telnetd -debug 9999 -L /tmp/mytelnetlogin

并使用环境中的变量连接到它:

TERM='A=1:b=2' telnet localhost 9999

您应该会看到登录提示,登录后将echo $MYTERM显示a=1:b=2您可以像平常一样操作的值。显然,对于真正的解决方案,您需要将选项放入-L/etc/inetd.conf而不是/tmp用于脚本。

请注意,这telnetlogin是一个 setuid-root 程序,预计将从用户 id 调用telnetd。这是为了允许inetd以非 root 身份运行服务器,并且仅使用 root 登录。

如果您愿意忽略此​​安全措施,您可以in.telnetd以 root 身份运行并让它运行标准登录/bin/login.这样您就不需要中间mytelnetlogin脚本来操作该变量。例如:

sudo /usr/sbin/in.telnetd -debug 9999 -L /bin/login

相关内容