根据 shell 在 .bashrc 中设置 PATH

mor*_*row 3 linux bash path bashrc

我有一个switcher有不同用例的用户。这PATH应该取决于当前 shell 是否受到限制。因此我在末尾添加了/home/switcher/.bashrc

[[ $- == *r* ]] && PATH='' && echo 'restricted' || echo 'unrestricted' 
Run Code Online (Sandbox Code Playgroud)

但切换用户时却无法按预期工作:

root@host:~$ sudo -u switcher rbash
unrestricted
switcher@host:~$ echo $PATH
/home/switcher/bin:/usr/local/bin:/usr/bin:/bin
switcher@host:~$ echo $- $SHELL
himrBHs /usr/sbin/nologin
Run Code Online (Sandbox Code Playgroud)

这告诉我,这.bashrc实际上是被处决的,但显然是在外面rbash。我在这里缺少什么?我需要更改什么以便PATH=''在执行时设置rbash而不是在中设置bash

请注意,不幸的是,对于不同的用例使用不同的用户对我来说不是一个选择。

Kam*_*ski 5

我的测试显示r出现在$-after rbashread中~/.bashrc,就好像 shell 在处理文件期间不受限制一样。这与手册中有关限制的内容相对应:

\n
\n

这些限制在读取任何启动文件后强制执行。

\n
\n

限制之一是无法改变PATH。既然您确实想要更改PATH,那么稍后执行限制实际上对您的情况有好处。看来r$-shell目前已被有效限制。您想要检测它是否会受到有效限制。你不能使用$-此目的。

\n

有一个专门为您需要做的事情而设计的机制。在里面shopt[强调我的]:

\n
\n

restricted_shell

\n

如果 shell 在受限模式 [\xe2\x80\xa6] 下启动,则会设置此选项。该值可能无法更改。执行启动文件时不会重置此设置,从而允许启动文件发现 shell 是否受到限制

\n
\n

像这样使用它:

\n
shopt -q restricted_shell && PATH=\'\' && echo \'restricted\' || echo \'unrestricted\'\n
Run Code Online (Sandbox Code Playgroud)\n

或更好:

\n
if shopt -q restricted_shell; then\n   PATH=\'\'\n   echo \'restricted\'\nelse\n   echo \'unrestricted\'\nfi\n
Run Code Online (Sandbox Code Playgroud)\n

后者更好,因为第二个echo仅取决于 的退出状态shopt。为了进行比较:在前面的代码片段(以及在您的原始代码中)中,第一个失败echo将触发第二个echo. 对于echos 来说,这似乎是微不足道的、无关紧要的或无害的,但是如果您添加更多命令,那么一行包含许多&&||如果其中一个命令意外失败,您可能会感到惊讶。

\n

另请注意,打印任何内容.bashrc都会破坏scp类似的软件(甚至打印到 stderr 也可能),除非.bashrc足够聪明

\n