非命令列 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 5hosts_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 將資料寫入進程的 stdin,並使用預設由 socketpair() 產生的 UNIX 域套接字從其 stdout 讀取資料。


我相信類似的解決方案可以使用網貓或者內網

答案3

如果這是 Linux 系統,請使用inetdxinetd。建立一個指向標準 telnet 連接埠的新服務,並將可執行檔指定為實際服務。

相關內容