`which nologin` 在 SSH 上不起作用,而 `which false` — 可以工作

`which nologin` 在 SSH 上不起作用,而 `which false` — 可以工作

我想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 可能会被设置多次:

  1. 通过 sshd 本身,无论是内置的还是来自 /etc/login.defs。
  2. 通过 PAM 模块(但通常不是)。
  3. 通过 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"

相关内容