非命令行 Telnet 服务器

非命令行 Telnet 服务器

我正在寻找一种简单的方法来接受 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 域套接字从其标准输出读取数据。


我相信使用类似的解决方案是可能的网猫或者inetd

答案3

如果这是 Linux 系统,请使用inetdxinetd。创建一个指向标准 telnet 端口的新服务,并将您的可执行文件指定为实际服务。

相关内容