我需要使用以下语法在 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