Ich suche nach einer einfachen Möglichkeit, Telnet-Verbindungen zu akzeptieren, ohne eine Shell-Schnittstelle bereitzustellen, ähnlich wie ein MUD-Server. Eigentlich möchte ich statische Inhalte bereitstellen, eher wie:
telnet towel.blinkenlights.nl
Der Server muss für jede neue Telnet-Verbindung eine neue Instanz einer Drittanbieteranwendung (in diesem Fall VLC) starten und die Ausgabe der Anwendung (ASCII-Video-Rendering) direkt an den Remote-Benutzer übermitteln.
Irgendwelche Vorschläge, wo ich hier anfangen kann?
Antwort1
Die einfachste Lösung besteht darin, VLC zur Anmelde-Shell der Benutzer zu machen, wie folgt:
joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/usr/bin/cvlc
oder welches Programm Sie auch immer ausführen möchten. Eine Einschränkung hierbei ist, dass Sie keine Befehlszeilenargumente angeben können. Sie benötigen wahrscheinlich normale passwd
Einträge:
joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/bin/sh
und geben Sie dann jedem Benutzer eine, .profile
die besagt
exec /usr/bin/cvlc --
(Deine Optionen)playlist.xspf
oder welche Argumente Sie auch immer wollen.
Ich bin mir nicht sicher, was Sie mit „ASCII-Video-Rendering“ meinen. Möchten Sie Audio/Video auf der Workstation des Benutzers abspielen? Betreibt der Benutzer einen X11-Server? Wenn ja, sollten Sie
w=`who am i`
d=`expr "$w" : '.*(\(.*\))'`
in .profile
und fügen Sie dann hinzu
--x11-display "$d":0
ZuDeine Optionen. Achtung: Es gibt verschiedene Bedingungen, die zu einem Fehler führen können.
Antwort2
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
ein einfacher Server, der Verbindungen akzeptiert (TCP4-LISTEN) und für jede Verbindung einen neuen Kindprozess erstellt; jeder Kindprozess fungiert als einzelnes Relay. Der Client muss die Regeln für den Daemonprozessnamen „script“ in /etc/hosts.allow und /etc/hosts.deny erfüllen, andernfalls wird ihm der Zugriff verweigert (siehe „man 5 hosts_access“). Um das Programm auszuführen, wechselt der Kindprozess per chroot zu /home/sandbox, per su zur Benutzer-Sandbox und startet dann das Programm /home/sandbox/bin/myscript. Socat und myscript kommunizieren über ein Pseudo-TTY (pty); der stderr von myscript wird auf stdout umgeleitet, sodass seine Fehlermeldungen über socat an den verbundenen Client übertragen werden.
Sie können 5555 in 23 ändern (die Standard-Portnummer von Telnet).
Ändern Sie /bin/myscript in Ihr VLC-Skript oder Ihre Binärdatei.
http://www.dest-unreach.org/socat/doc/socat.html#ADDRESS_TYPES
EXEC:<command-line>
Forkt einen Unterprozess, der die Kommunikation mit seinem übergeordneten Prozess aufbaut und das angegebene Programm mit execvp() aufruft. <command-line> ist ein einfacher Befehl mit Argumenten, die durch einzelne Leerzeichen getrennt sind. Wenn der Programmname einen '/' enthält, wird der Teil nach dem letzten '/' als ARGV[0] verwendet. Wenn der Programmname ein relativer Pfad ist, gilt die execvp()-Semantik zum Auffinden des Programms über $PATH. Nach erfolgreichem Programmstart schreibt socat Daten in die Standardeingabe des Prozesses und liest von dessen Standardausgabe, wobei standardmäßig ein von socketpair() generierter UNIX-Domain-Socket verwendet wird.
Ich glaube, dass ähnliche Lösungen möglich sind mitNetzkatzeoderinetd
Antwort3
Wenn es sich um ein Linux-System handelt, verwenden Sie inetd
oder xinetd
. Erstellen Sie einen neuen Dienst, der auf den Standard-Telnet-Port verweist, und geben Sie Ihre ausführbare Datei als eigentlichen Dienst an.