Estoy buscando una forma sencilla de aceptar conexiones telnet sin proporcionar una interfaz de shell, algo así como un servidor MUD. De hecho, estoy buscando ofrecer contenido estático, más como:
telnet towel.blinkenlights.nl
El servidor tendrá que iniciar una nueva instancia de una aplicación de terceros (en este caso, VLC) para cada nueva conexión telnet y entregar la salida de la aplicación (representación de video ASCII) directamente al usuario remoto.
¿Alguna sugerencia sobre por dónde puedo empezar aquí?
Respuesta1
La solución simple es hacer que VLC sea el shell de inicio de sesión de los usuarios, como en:
joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/usr/bin/cvlc
o cualquier programa que quieras ejecutar. Una limitación de esto es que no puede especificar argumentos de línea de comandos. Probablemente necesites tener passwd
entradas normales:
joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/bin/sh
y luego darle a cada usuario un .profile
que diga
exec /usr/bin/cvlc --
(sus opciones)playlist.xspf
o los argumentos que quieras.
No estoy seguro de lo que quieres decir con "representación de vídeo ASCII". ¿Quieres reproducir audio/vídeo en la estación de trabajo del usuario? ¿El usuario está ejecutando un servidor X11? Si es así deberías poner
w=`who am i`
d=`expr "$w" : '.*(\(.*\))'`
en el .profile
y luego agregue
--x11-display "$d":0
asus opciones. Advertencia: existen varias condiciones que pueden hacer que esto falle.
Respuesta2
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
un servidor simple que acepta conexiones (TCP4-LISTEN) y bifurca un nuevo proceso hijo para cada conexión; cada niño actúa como único relevo. El cliente debe coincidir con las reglas para el nombre del proceso demonio "script" en /etc/hosts.allow y /etc/hosts.deny; de lo contrario, se le negará el acceso (consulte "man 5 hosts_access"). Para EJECUTAR el programa, el proceso secundario va a /home/sandbox, su al usuario sandbox y luego inicia el programa /home/sandbox/bin/myscript. Socat y myscript se comunican mediante un pseudo tty (pty); El stderr de myscript se redirige a stdout, por lo que sus mensajes de error se transfieren a través de socat al cliente conectado.
Puede cambiar 5555 a 23 (el número de puerto predeterminado de Telnet)
Cambie /bin/myscript a su script o binario VLC.
http://www.dest-unreach.org/socat/doc/socat.html#ADDRESS_TYPES
EXEC:<command-line>
Bifurca un subproceso que establece comunicación con su proceso principal e invoca el programa especificado con execvp(). <command-line> es un comando simple con argumentos separados por espacios simples. Si el nombre del programa contiene un '/', la parte después del último '/' se toma como ARGV[0]. Si el nombre del programa es una ruta relativa, se aplica la semántica execvp() para encontrar el programa a través de $PATH. Después de un inicio exitoso del programa, socat escribe datos en la entrada estándar del proceso y los lee desde su salida estándar utilizando un socket de dominio UNIX generado por socketpair() de forma predeterminada.
Creo que son posibles soluciones similares usandonetcatoinetd
Respuesta3
Si se trata de un sistema Linux, utilice inetd
o xinetd
. Cree un nuevo servicio que apunte al puerto telnet estándar y especifique su ejecutable como el servicio real.