Разделение поля происходит после раскрытия , а пробелы IFS
игнорируются в начале и конце ] весь вход (чтобы не создавать поля перед первым «логическим» полем или после последнего). Таким образом, к тому времени, когда дело доходит до разделения полей, вашим первым примером будет
echo one two 'and three'
, который разбирается на поля одно
, два
и и три
; аналогично ваш второй пример -
echo one two 'and three'
, который также разбирается на поля , один
, , два
и и три
.
Это намеренный выбор безопасности. Однако вы можете настроить свой сервер 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