Большинство сетевых серверов не должно вызвать подпроцессы любого вида. Из соображений безопасности их путь должен быть минимален.
Важное исключение - все сервисы, которые позволяют подключаться к системе через сеть. Этот раздел описывает окружение в этих случаях. Если команда выполняется на удаленной машине с помощью rsh, она получает другой path, чем тот, если команда выполнена с помощью ssh. Подобно, вход в систему с помощью rlogin, Telnet или ssh различны.
Большинство сетевых сервисов не имеют собственного процесса для постоянного ожидания запросов. Эта работа поручается супер-серверу интернет, называемому inetd. Inetd слушает все определенные сетевые порты и запускает соответствующий сервер, когда имеется входящий запрос. Этот режим определен в /etc/inetd.conf.
inetd стартует из скрипта при запуске системы. Он наследует пути процесса init. Он не изменяет их, и все серверы стартующие от inetd имеют пути процесса init. Пример такого сервера imapd, сервер почтового протокола IMAP.
Другие примеры процессы inetd - telnetd, rlogind, talkd, ftp, popd, многие http серверы и т.д.
Часто использование inetd еще усложняется, при использовании отдельной программы tcpd для запуска конкретного сервера. Это программа делает дополнительную проверку безопасности до запуска конкретного приложения. Она не изменяет пути (не проверено).
Демон rsh устанавливает пути из определения _PATH_DEFPATH (/usr/include/paths.h), этот же путь использует программа login для нормальных пользователей. Root получит тот же путь, что и нормальный пользователь.
Фактически, rshd выполняет команду, полученную из командной строки:
shell -c command-line |
и shell, это не login-shell. Желательно, чтобы все оболочки, упомянутые в /etc/passwd, поддерживали опцию -c.
Rlogin вызывается при входе в систему, чтобы запустить реальную процедуру входа в систему. Если вы входите с помощью rlogin, то получаете те же самые пути, что и при обычном входе в систему. Большинство других способов войти на Linux компьютер не использует login. Обратите внимание на разность с rsh.
Команда login фактически использует
login -p -h host-name user-name |
-p сохраняет среду окружения, кроме переменных HOME, PATH, SHELL, TERM, MAIL и LOGNAME. -h сообщает удаленному хосту имя для регистрации.
Telnet является че- то подобным rlogin. Использует программу login и командную строку.
ssh имеет собственную установку путей. Он добавляет каталог, где находится ssh. Часто это означает, что /usr/bin находится в пути дважды:
/usr/local/bin:/usr/bin:/bin:.:/usr/bin |
Путь не содержит /usr/X11/bin, и оболочка, вызванная командой ssh - не оболочка входа в систему. Таким образом,
ssh remotehost xterm |
не работает, и что-либо в /etc/profile или в /etc/csh.cshrc может заменить это. Вы должны всегда использовать явный путь /usr/bin/X11/xterm.
ssh ищет переменные окружения в форме VAR=VALUE в файле /etc/environment. К сожалению, это вызывает некоторые проблемы с XFree86.