Я ищу простой способ принимать telnet-соединения без предоставления интерфейса оболочки, что-то вроде сервера MUD. На самом деле я ищу способ обслуживания статического контента, больше похожего на:
telnet towel.blinkenlights.nl
Серверу придется запускать новый экземпляр стороннего приложения (в данном случае VLC) для каждого нового telnet-подключения и доставлять выходные данные приложения (рендеринг видео ASCII) непосредственно удаленному пользователю.
Есть ли у вас предложения, с чего можно начать?
решение1
Простейшее решение — сделать VLC оболочкой входа пользователей, например:
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) и создает новый дочерний процесс для каждого соединения; каждый дочерний процесс действует как одиночный ретранслятор. Клиент должен соответствовать правилам для имени процесса-демона "script" в /etc/hosts.allow и /etc/hosts.deny, в противном случае ему будет отказано в доступе (см. "man 5 hosts_access"). Для выполнения программы дочерний процесс выполняет chroot в /home/sandbox, su в пользовательскую песочницу, а затем запускает программу /home/sandbox/bin/myscript. Socat и myscript взаимодействуют через псевдотерминал (pty); stderr myscript перенаправляется в 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]. Если имя программы — это относительный путь, применяется семантика execvp() для поиска программы через $PATH. После успешного запуска программы socat записывает данные в stdin процесса и считывает из его stdout, используя сокет домена UNIX, сгенерированный socketpair() по умолчанию.
Я считаю, что подобные решения возможны с использованиемнеткатилиинетд
решение3
Если это система Linux, используйте inetd
или xinetd
. Создайте новую службу, указывающую на стандартный порт telnet, и укажите исполняемый файл в качестве фактической службы.