我想nologin
通过 SSH 知道远程机器上的位置。因此,我运行。但是,命令返回非零。但运行 which false 是可以的。ssh [email protected] 'which nologin'
请注意1!
输出中表示我的命令提示符中的最后一个命令执行结果:
$ ssh [email protected] 'which nologin'
1! $ ssh [email protected] 'which false'
/bin/false
$
如果我登录到该主机并执行,which nologin
我会得到结果:/usr/sbin/nologin
。
为什么它which nologin
不能通过 SSH 工作?
答案1
1) 在登录过程中,$PATH 可能会被设置多次:
- 通过 sshd 本身,无论是内置的还是来自 /etc/login.defs。
- 通过 PAM 模块(但通常不是)。
- 通过 shell 的“profile”脚本(/etc/profile、~/.profile)。
在您的情况下,步骤 1 中设置的路径没有 /sbin 或 /usr/sbin,但步骤 3 中设置的路径有。
2) 根据 shell 的不同,它在“批处理”(单一命令)模式下的行为可能与在“交互”模式下的行为不同。
尤其是 Bash,在非交互启动时不会读取 /etc/profile 或 ~/.profile。换句话说,它只是跳过步骤 3 中的配置,该配置通常会将 /usr/sbin 添加到命令路径中。
(Bash 的行为实际上依赖于发行版:一些 Linux 发行版启用了编译时选项,使其在所有模式下读取配置文件脚本。)
一种可以接受的解决方法:
ssh user@host ". /etc/profile; . ~/.profile; which nologin"