这并不是一个真正的问题,只是我想了解的一个特点。
如果我得到一个 root shellsudo bash -l
然后运行less somefilename
我得到的信息更少只显示:
该帐户当前不可用。
(这不会显示为错误,而是显示在 less 内,就好像它是文件的内容一样。)
但是,如果我使用相同的 root shell 并sudo bash -l
运行,cat somefilename | less
那么我会看到文件的实际内容。
另外,如果我获得一个 root shell 并sudo bash
跳过-l
然后运行less somefilename
它将显示文件的内容。
Root登录被禁用;该/etc/passwd
线路root:x:0:0:root:/root:/sbin/nologin
根本sudo su -
不起作用。
但是,为什么该条目会对在文件上nologin
运行产生任何影响呢?为什么它只在直接在文件上运行而不是也应用于在其标准输入上运行时less
才会产生影响?less
而且,为什么只有bash -l
shell 才会出现这种情况?
(这是在 CentOS 7 系统上。)
发生这种情况是因为调用或
less
中指定的命令的方法。如果设置了环境变量,它将使用其值作为 shell 来运行它们。LESSOPEN
LESSCLOSE
SHELL
因此,在您的场景中,由于
LESSOPEN
设置了(由于使用了lesspipe
),less
运行与 的等效项"$SHELL" -c …
,并将其结果显示为文件内容(因为这是管道的预期行为LESSOPEN
)。由于SHELL
isnologin
,您会看到该命令的输出。在默认设置下,如果管道本身从管道接收输入,则
lesspipe
不会使用管道,这解释了这种行为。less
SHELL
仅由登录 shell 设置。如果您bash
在没有 的情况下运行-l
,SHELL
则保留它之前具有的任何值。(事实上,由于
less
使用了popen
,所以运行的命令是sh -c "$SHELL" -c …
)