Bash

rbash - 如何允許一些命令並修復自動完成?

  • October 5, 2022

我需要為某些使用者設置受限外殼。

這是通過以下方式實現的:

sudo ln -s /bin/bash /bin/rbash
sudo useradd test1 -s /bin/rbash

新使用者很好,預設情況下它位於受限制的外殼上,但我發現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。

首先,從bash5.0.3 版開始,rbash它仍然不安全——它不會在執行.profileor期間禁用 Ctrl/C,這意味著在預設值受到適當限制.bash_profile之前,很可能會突破到 shell 提示符。$PATH此時很容易執行(比如說)dash然後bash得到一個乾淨的外殼。

cd命令被設計拒絕。繼續閱讀rbash(查看man bash並蒐索rbash)以查看完整的詳細資訊,但一個簡短的列表包括以下被拒絕操作的列表:

  • 改變目錄cd
  • 設置或取消設置SHELL, PATH, ENV, 或BASH_ENV
  • 指定包含“/”的命令名稱
  • 使用>, >|, <>, >&,&>>>重定向運算符重定向輸出
  • 使用 set +r 或 set +o 限制關閉受限模式

不幸的是,自動完成在使用者的上下文中執行,並將某些命令的輸出重定向或嘗試重定向到/dev/null.

其他 shell(例如rsh( sh) )在執行期間正確實現了鎖定,.profile以便暫時禁用 Ctrl/C,但cd仍然存在限制。

你說你需要cd工作。在這種情況下,您將無法使用受限外殼。當然,這取決於您的要求,使用 chroot 環境可能會更好。或者,也許執行必要任務的腳本就足夠了。如果可以將其放置到通過該目錄訪問的目錄中,$PATH則使用者可以直接使用該腳本。

引用自:https://unix.stackexchange.com/questions/719836