Как заставить telnetd принимать произвольные данные в переменной TERM?

Разделение поля происходит после раскрытия , а пробелы IFS игнорируются в начале и конце ] весь вход (чтобы не создавать поля перед первым «логическим» полем или после последнего). Таким образом, к тому времени, когда дело доходит до разделения полей, вашим первым примером будет

echo   one   two   'and three'

, который разбирается на поля одно , два и и три ; аналогично ваш второй пример -

echo   one   two    'and three'

, который также разбирается на поля , один , , два и и три .

2
06.04.2017, 23:22
1 ответ

Это намеренный выбор безопасности. Однако вы можете настроить свой сервер telnetd на передачу переменной TERM, хотя ее значение будет преобразовано в нижний регистр. Фактическая проверка на наличие легальных значений TERM выполняется не самим in.telnetd, а программой входа, telnetlogin, которую вызывает сервер. Вы можете настроить ваш сервер telnetd на запуск другой программы входа, например, промежуточного сценария оболочки, который размонтирует переменную перед продолжением входа. Например, чтобы проверить это, создайте файл /tmp/mytelnetlogin с содержимым:

#!/bin/bash
export MYTERM=$TERM
export TERM=dumb
exec /usr/lib/telnetlogin "$@"

и выполните chmod +x на нем. Затем запустите свою собственную тестовую версию telnetd на порту 9999:

sudo sudo -u telnetd /usr/sbin/in.telnetd -debug 9999 -L /tmp/mytelnetlogin

и подключитесь к нему с вашей переменной в окружении:

TERM='A=1:b=2' telnet localhost 9999

Вы должны увидеть приглашение на вход, и после входа echo $MYTERM покажет значение a=1:b=2, которым вы можете манипулировать, как вы обычно делаете. Очевидно, что для реального решения вам нужно установить опцию -L в /etc/inetd.conf, а не использовать /tmp для скрипта.

Обратите внимание, что telnetlogin - это программа setuid-root, которая, как ожидается, будет вызвана от пользователя id telnetd. Это сделано для того, чтобы inetd мог запускать сервер как не root, и использовать root только для входа в систему.

Если вы предпочитаете игнорировать эту меру безопасности, вы можете запустить in.telnetd от имени root и заставить его выполнить стандартный вход, /bin/login. После этого вам не понадобится промежуточный сценарий mytelnetlogin для работы с переменной. Например:

sudo /usr/sbin/in.telnetd -debug 9999 -L /bin/login
2
27.01.2020, 22:10

Теги

Похожие вопросы