Bash

bash 如何知道它是如何被呼叫的?

  • June 25, 2014

我已經安裝jailkit並且Ubuntu 12.04我已經設置了一個使用者的shell /bin/bash- 但是當它被呼叫時它執行/etc/bash.bashrc而不是/etc/profile

如果您以前沒有使用jailkit過,這裡是它的要點:

  1. 系統根目錄的“監獄”版本在某處創建,例如 /home/jail
  2. 被監禁的使用者主目錄被移動到該文件夾中,如 /home/jail/home/testuser
  3. 相關配置文件被複製到 /home/jail/etc/ - 包括有限的 /etc/passwd
  4. 您希望允許訪問的程序被複製到相應的目錄,例如 /bin/bash
  5. 當被監禁的使用者登錄時,他們會被 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。我建議提出功能請求。

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