![非命令行 Telnet 服务器](https://linux22.com/image/1326524/%E9%9D%9E%E5%91%BD%E4%BB%A4%E8%A1%8C%20Telnet%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我正在寻找一种简单的方法来接受 telnet 连接而不提供 shell 接口,有点像 MUD 服务器。我实际上希望提供静态内容,更像是:
telnet towel.blinkenlights.nl
服务器必须为每个新的 telnet 连接启动第三方应用程序(在本例中为 VLC)的新实例,并将应用程序的输出(ASCII 视频渲染)直接传递给远程用户。
关于我可以从哪里开始,有什么建议吗?
答案1
简单的解决方案是让 VLC 成为用户的登录 shell,如下所示:
joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/usr/bin/cvlc
或任何您想要运行的程序。对此的限制是您无法指定命令行参数。您可能需要有常规passwd
条目:
joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/bin/sh
然后给每个用户.profile
一个
exec /usr/bin/cvlc --
(您的选择)playlist.xspf
或者任何你想要的论点。
我不确定你说的“ASCII 视频渲染”是什么意思。你想在用户的工作站上播放音频/视频吗?用户是否正在运行 X11 服务器?如果是,你应该把
w=`who am i`
d=`expr "$w" : '.*(\(.*\))'`
进入.profile
,然后添加
--x11-display "$d":0
到你的选择。警告:有多种情况可能导致此操作失败。
答案2
http://www.dest-unreach.org/socat/doc/socat.html#EXAMPLE_ADDRESS_EXEC
socat TCP4-LISTEN:5555,fork,tcpwrap=script \
EXEC:/bin/myscript,chroot=/home/sandbox,su-d=sandbox,pty,stderr
一个简单的服务器,它接受连接(TCP4-LISTEN)并为每个连接派生一个新的子进程;每个子进程都充当单个中继。客户端必须符合 /etc/hosts.allow 和 /etc/hosts.deny 中守护进程名称“script”的规则,否则将被拒绝访问(请参阅“man 5 hosts_access”)。为了执行程序,子进程 chroot 到 /home/sandbox,su 到用户沙箱,然后启动程序 /home/sandbox/bin/myscript。Socat 和 myscript 通过伪 tty (pty) 进行通信;myscript 的 stderr 被重定向到 stdout,因此其错误消息通过 socat 传输到连接的客户端。
您可以将 5555 更改为 23(Telnet 的默认端口号)
将 /bin/myscript 更改为您的 VLC 脚本或二进制文件。
http://www.dest-unreach.org/socat/doc/socat.html#ADDRESS_TYPES
EXEC:<command-line>
分叉一个子进程,该子进程与其父进程建立通信并使用 execvp() 调用指定的程序。 <command-line> 是一个简单的命令,其参数由单个空格分隔。 如果程序名称包含“/”,则最后一个“/”后面的部分将被视为 ARGV[0]。 如果程序名称是相对路径,则通过 $PATH 查找程序的 execvp() 语义适用。 程序成功启动后,socat 将数据写入进程的标准输入,并使用默认情况下由 socketpair() 生成的 UNIX 域套接字从其标准输出读取数据。
答案3
如果这是 Linux 系统,请使用inetd
或xinetd
。创建一个指向标准 telnet 端口的新服务,并将您的可执行文件指定为实际服务。