Telnet-Server ohne Befehlszeile

2

Ich suche nach einer einfachen Möglichkeit, Telnet-Verbindungen zu akzeptieren, ohne eine Shell-Schnittstelle bereitzustellen, ähnlich wie bei einem MUD-Server. Eigentlich möchte ich statischen Inhalt liefern, eher wie folgt:

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 Remotebenutzer übermitteln.

Irgendwelche Vorschläge, wo ich hier anfangen kann?

Mikkel
quelle

Antworten:

1

Die einfältige Lösung besteht darin, VLC zur Login-Shell der Benutzer zu machen, wie in:

joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/usr/bin/cvlc

oder welches Programm Sie ausführen möchten. Eine Einschränkung besteht darin, dass Sie keine Befehlszeilenargumente angeben können. Sie benötigen wahrscheinlich normale passwdEinträge:

joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/bin/sh

und dann geben Sie jedem Benutzer ein .profile, das sagt

exec /usr/bin/cvlc --(Deine Optionen) playlist.xspf

oder welche Argumente Sie wollen.

Ich bin nicht sicher, was Sie mit "ASCII-Video-Rendering" meinen. Möchten Sie Audio / Video auf der Workstation des Benutzers abspielen? Läuft auf dem Benutzer ein X11-Server? Wenn ja, sollten Sie setzen

w=`who am i`
d=`expr "$w" : '.*(\(.*\))'`

in die .profileund dann hinzufügen

--x11-display "$d":0

zu Ihren Optionen . Warnung: Es gibt verschiedene Bedingungen, unter denen dies fehlschlagen kann.

Scott
quelle
ASCII-Video-Rendering bedeutet wahrscheinlich aalib
Alan Curry
Das ist richtig. Ich experimentiere mit einem AALIB-basierten Telnet-Video-Player. Ich werde sehen, ob es möglich ist, Ihre Lösung für die Verwendung eines Shell-Script-Wrappers anzupassen. Die andere Schwierigkeit besteht darin, dass der Telnet-Server anonyme Anmeldungen (und keine Benutzeranmeldung) akzeptieren sollte. Port 22 verwendet eine IP-Whitelist, aber Port 23 muss offen sein. Danke für die Antwort. Ich muss die Auswirkungen auf die Sicherheit genauer untersuchen, bevor ich sie akzeptiere, aber ich schätze die Anstrengungen, die Sie unternommen haben. Ich habe noch nicht genug Repräsentanten, um abzustimmen.
Mikkel
In den meisten (nicht allen) Versionen von * nix können Sie Benutzer ohne Kennwort konfigurieren. Wenn Sie beispielsweise einen Benutzer vlcohne Kennwort erstellt und dies veröffentlicht hätten, würde dies Ihre Anonymitätsanforderung erfüllen?
Scott
Sie könnten Logik zu vlc's hinzufügen .profile, um die Quelladresse zu validieren, aber das würde sehr wenig Sicherheit bieten.
Scott
Es sieht so aus, als ob diese Funktionalität in telnetdUbuntu unterstützt wird, aber ich untersuche sie immer noch. Ich habe es jedoch geschafft, das Video für einen authentifizierten Benutzer zum Abspielen zu bringen, testindem ich ein einfaches Shell-Skript geschrieben und es als Anmeldeshell festgelegt habe: #!/bin/bash \n cvlc -V aa /var/local/vlc/test.mp4(Verwenden von \ n anstelle von newline hier, da Superuser Zeilenumbrüche in Antworten minimiert.)
Mikkel
1

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 untergeordneten Prozess ausgibt. Jedes Kind fungiert als einzelnes Relais. Der Client muss den Regeln für den Daemon-Prozessnamen "script" in /etc/hosts.allow und /etc/hosts.deny entsprechen, andernfalls wird ihm der Zugriff verweigert (siehe "man 5 hosts_access"). Zum Ausführen des Programms verarbeitet das Kind chroot's to / home / sandbox, su's to user sandbox und startet dann das Programm / home / sandbox / bin / myscript. Socat und myscript kommunizieren über eine Pseudotty (pty); Der stderr von myscript wird nach stdout umgeleitet, so dass die Fehlermeldungen über socat an den verbundenen Client übertragen werden.

Sie können 5555 in 23 ändern (die Standardportnummer 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>

Verzweigt einen Unterprozess, der die Kommunikation mit dem übergeordneten Prozess herstellt und das angegebene Programm mit execvp () aufruft. <Befehlszeile> ist ein einfacher Befehl mit Argumenten, die durch einzelne Leerzeichen getrennt sind. Wenn der Programmname ein '/' enthält, wird der Teil nach dem letzten '/' als ARGV [0] genommen. Wenn der Programmname ein relativer Pfad ist, gilt die execvp () - Semantik zum Auffinden des Programms über $ PATH. Nach erfolgreichem Programmstart schreibt socat Daten in das Standardverzeichnis des Prozesses und liest sie mit einem von socketpair () standardmäßig generierten UNIX-Domain-Socket aus dem Standardverzeichnis.


Ich glaube, dass ähnliche Lösungen mit netcat oder inetd möglich sind

RedGrittyBrick
quelle
0

Wenn dies ein Linux-System ist, verwenden Sie inetdoder xinetd. Erstellen Sie einen neuen Dienst, der auf den Standard-Telnet-Port verweist, und geben Sie Ihre ausführbare Datei als tatsächlichen Dienst an.

LawrenceC
quelle