大多数网络服务器不应调用任何类型的子进程。出于安全原因,它们的路径应尽可能精简。
一个重要的例外是所有允许从网络登录系统的服务。本节描述了在这些情况下环境是什么样的。如果命令在远程机器上使用 rsh 执行,它获得的路径与使用 ssh 执行时不同。类似地,使用 rlogin、Telnet 或 ssh 登录也不同。
大多数网络服务器没有自己的进程一直等待请求。这项工作被委托给一个名为 inetd 的 Internet 超级服务器。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 不是登录 shell。理想情况下,/etc/passwd 中提到的所有 shell 都应支持 -c 选项以在命令行上给出。
Rlogin 调用 login 来执行真正的登录过程。如果您使用 rlogin 登录,您将获得与 login 相同的路径。大多数其他登录 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 命令调用的 shell 不是登录 shell。因此
ssh remotehost xterm
永远不起作用,并且 /etc/profile 或 /etc/csh.cshrc 中的任何内容都可以更改这一点。您必须始终使用显式路径 /usr/bin/X11/xterm。
ssh 从文件 /etc/environment 中搜索 VAR=VALUE 形式的环境变量。不幸的是,这会导致 XFree86 出现一些问题。