我需要为某些用户提供受限的 shell。
这是通过以下方式实现的:
sudo ln -s /bin/bash /bin/rbash
sudo useradd test1 -s /bin/rbash
新用户很好,默认情况下它会登陆受限制的 shell,但我发现cd
不允许的情况很烦人,自动完成功能不起作用,例如:
test1@hostone [ ~ ]$ cd /
-rbash: cd: restricted
test1@hostone [ ~ ]$ sudo cd /con<TAB pressed here>-rbash: /dev/null: restricted: cannot redirect output
bash: _upvars: `-a3': invalid number specifier
-rbash: /dev/null: restricted: cannot redirect output
bash: _upvars: `-a0': invalid number specifier
^C
test1@hostone [ ~ ]$ sudo cd /config
sudo: cd: command not found
test1@hostone [ ~ ]$ docker logs ag<TAB pressed here>-rbash: /dev/null: restricted: cannot redirect output
-rbash: /dev/null: restricted: cannot redirect output
bash: _upvars: `-a3': invalid number specifier
-rbash: /dev/null: restricted: cannot redirect output
bash: _upvars: `-a0': invalid number specifier
^C
test1@hostone [ ~ ]$
如何允许单独的命令,例如cd
?我应该如何修复自动完成功能?
如果您想知道操作系统是 Photon OS。
答案1
首先,从bash
版本 5.0.3 开始,rbash
仍然不安全 - 它不会在执行.profile
或期间禁用 Ctrl/C,这意味着在默认值受到适当限制.bash_profile
之前,很可能会进入 shell 提示符。$PATH
此时很容易执行(比如说)dash
,然后bash
获得一个干净的 shell。
该cd
命令在设计上被拒绝。阅读rbash
(请参阅man bash
并搜索rbash
)以查看完整的详细信息,但简短的列表包括以下被拒绝操作的列表:
- 更改目录
cd
SHELL
设置或取消设置、PATH
、ENV
或的值BASH_ENV
- 指定包含“/”的命令名称
- 使用
>
、>|
、<>
、>&
、&>
和>>
重定向运算符重定向输出 - 使用 set +r 或 set +o strict 关闭限制模式
不幸的是,自动完成在用户上下文中运行,并将某些命令的输出重定向(或尝试重定向)到/dev/null
.
其他 shell(例如rsh
( sh
))在 执行期间正确实现锁定,.profile
以便暂时禁用 Ctrl/C,但对 的限制cd
仍然存在。
你说你需要cd
工作。在这种情况下,您将无法使用受限 shell。当然,根据您的要求,使用 chroot 环境可能会更好。或者,也许执行必要任务的脚本就足够了。如果可以将其放入可访问的目录中,$PATH
则用户可以直接使用该脚本。