2

Я ищу простой способ принимать соединения telnet без предоставления интерфейса оболочки, вроде сервера MUD. Я на самом деле хочу обслуживать статический контент, больше похожий на:

telnet towel.blinkenlights.nl

Сервер должен будет запускать новый экземпляр стороннего приложения (в данном случае VLC) для каждого нового соединения telnet и доставлять выходные данные приложения (рендеринг видео ASCII) непосредственно удаленному пользователю.

Любые предложения о том, где я могу начать здесь?

3 ответа3

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

простой сервер, который принимает соединения (TCP4-LISTEN) и разветвляет новый дочерний процесс для каждого соединения; каждый ребенок действует как единое реле. Клиент должен соответствовать правилам для имени процесса-демона "script" в /etc/hosts.allow и /etc/hosts.deny, в противном случае ему будет отказано в доступе (см. "Man 5 hosts_access"). Для выполнения программы EXEC дочерний процесс обрабатывает chroot в /home /sandbox, su в пользовательскую песочницу, а затем запускает программу /home /sandbox /bin /myscript. Сокат и myscript общаются через псевдо-tty (pty); Стандер myscript перенаправляется на стандартный вывод, поэтому сообщения об ошибках передаются через socat подключенному клиенту.

Вы можете изменить 5555 на 23 (номер порта Telnet по умолчанию)

Измените /bin /myscript на ваш скрипт VLC или бинарный.


http://www.dest-unreach.org/socat/doc/socat.html#ADDRESS_TYPES

EXEC:<command-line>

Форки подпроцесса, который устанавливает связь с его родительским процессом и вызывает указанную программу с помощью execvp(). <командная строка> - это простая команда с аргументами, разделенными пробелами. Если имя программы содержит «/», часть после последней «/» принимается за ARGV [0]. Если имя программы является относительным путем, применяется семантика execvp() для поиска программы через $ PATH. После успешного запуска программы socat записывает данные в стандартный поток процесса и считывает из его стандартного вывода, используя сокет домена UNIX, сгенерированный по умолчанию socketpair().


Я считаю, что подобные решения возможны при использовании netcat или inetd

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

к вашим вариантам. Предупреждение: существуют различные условия, которые могут привести к сбою.

0

Если это система Linux, используйте inetd или xinetd . Создайте новый сервис, указывающий на стандартный порт telnet, и укажите свой исполняемый файл в качестве фактического сервиса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .