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?
请注意,不幸的是,对于不同的用例使用不同的用户对我来说不是一个选择。
我的测试显示r出现在$-after rbashread中~/.bashrc,就好像 shell 在处理文件期间不受限制一样。这与手册中有关限制的内容相对应:
\n\n这些限制在读取任何启动文件后强制执行。
\n
限制之一是无法改变PATH。既然您确实想要更改PATH,那么稍后执行限制实际上对您的情况有好处。看来r,$-shell目前已被有效限制。您想要检测它是否会受到有效限制。你不能使用$-此目的。
有一个专门为您需要做的事情而设计的机制。在里面shopt[强调我的]:
\n\n\n
restricted_shell如果 shell 在受限模式 [\xe2\x80\xa6] 下启动,则会设置此选项。该值可能无法更改。执行启动文件时不会重置此设置,从而允许启动文件发现 shell 是否受到限制。
\n
像这样使用它:
\nshopt -q restricted_shell && PATH=\'\' && echo \'restricted\' || echo \'unrestricted\'\nRun Code Online (Sandbox Code Playgroud)\n或更好:
\nif shopt -q restricted_shell; then\n PATH=\'\'\n echo \'restricted\'\nelse\n echo \'unrestricted\'\nfi\nRun Code Online (Sandbox Code Playgroud)\n后者更好,因为第二个echo仅取决于 的退出状态shopt。为了进行比较:在前面的代码片段(以及在您的原始代码中)中,第一个失败echo将触发第二个echo. 对于echos 来说,这似乎是微不足道的、无关紧要的或无害的,但是如果您添加更多命令,那么一行包含许多&&和||如果其中一个命令意外失败,您可能会感到惊讶。
另请注意,打印任何内容.bashrc都会破坏scp类似的软件(甚至打印到 stderr 也可能),除非您.bashrc足够聪明。
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |