bash 如何知道它是如何被呼叫的?
我已經安裝
jailkit
並且Ubuntu 12.04
我已經設置了一個使用者的shell/bin/bash
- 但是當它被呼叫時它執行/etc/bash.bashrc
而不是/etc/profile
如果您以前沒有使用
jailkit
過,這裡是它的要點:
- 系統根目錄的“監獄”版本在某處創建,例如 /home/jail
- 被監禁的使用者主目錄被移動到該文件夾中,如 /home/jail/home/testuser
- 相關配置文件被複製到 /home/jail/etc/ - 包括有限的 /etc/passwd
- 您希望允許訪問的程序被複製到相應的目錄,例如 /bin/bash
- 當被監禁的使用者登錄時,他們會被 chroot 到 /etc/jail/ 並且看不到上面的任何文件
所以我有一個
testuser
這樣的條目/etc/passwd
:testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh
在文件
/home/jail/etc/passwd
中有一個條目,如:testuser:1001:1003::/home/testuser:/bin/bash
我已經閱讀了
bash(1)
,所以我認為問題在於 bash 認為它沒有被作為登錄 shell 呼叫:當 bash 作為互動式登錄 shell 或作為帶有 –login 選項的非互動式 shell 呼叫時,它首先從文件 /etc/profile 中讀取並執行命令(如果該文件存在)。
我知道它
bash
實際上是被呼叫的,/usr/sbin/jk_chrootsh
但我不明白如何bash
確定它是什麼類型的 shell,以及它應該執行的啟動文件集。我想看看我是否可以解決這個問題 - 但我不明白:
bash 如何知道它是如何被呼叫的?
ps:我也調查過,
login(1)
沒有太多運氣。
通常 bash 知道它是一個登錄 shell,因為當登錄程序呼叫它時,它告訴 bash 它的名稱是
-bash
. 該名稱在argv[0]
第零個命令行參數中,這通常是使用者呼叫程序的方式。最初的連字元是告訴 shell 它是登錄 shell 的約定。如果您將選項--login
或-l
. 請參閱登錄 Shell 和非登錄 Shell 之間的區別?更多細節。從 Jailkit 2.16 開始,
jk_chrootsh
從各種來源讀取要呼叫的 shell 的絕對路徑,並將此路徑作為argv[0]
傳遞,並將其自己的命令行參數傳遞給該 shell。jk_chrootsh
在 where is 本身用於的正常案例中/etc/passwd
,無法傳遞參數,例如-l
. 由於絕對路徑不以 開頭-
,因此無法jk_chrootsh
呼叫登錄 shell,除非使用一個小的中間程序。#include <unistd.h> int main () { execl("/bin/bash", "-bash", NULL); return 127; }
我本來希望
jk_chrootsh
有一種簡單的方法來呼叫登錄 shell。我建議提出功能請求。