GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Woher weiß Bash, wie es aufgerufen wird?

Ich habe jailkit installiert auf Ubuntu 12.04 und ich habe eine Benutzer-Shell auf /bin/bash eingerichtet – aber wenn es aufgerufen wird, führt es /etc/bash.bashrc aus statt /etc/profile

Wenn Sie jailkit nicht verwendet haben vorher hier das Wesentliche:

  1. Irgendwo wird eine „eingesperrte“ Version des Systemstammverzeichnisses erstellt, z. B. /home/jail
  2. Home-Verzeichnisse von inhaftierten Benutzern werden in diesen Ordner verschoben, wie /home/jail/home/testuser
  3. Relevante Konfigurationsdateien werden nach /home/jail/etc/ kopiert – einschließlich eines begrenzten /etc/passwd
  4. Programme, denen Sie den Zugriff erlauben möchten, werden in die entsprechenden Verzeichnisse kopiert, wie
    /bin/bash
  5. Wenn sich ein inhaftierter Benutzer anmeldet, wird er nach /etc/jail/ chrooted und kann keine Dateien darüber sehen

Also habe ich einen testuser wer einen Eintrag in /etc/passwd hat so:

testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh

In der Datei /home/jail/etc/passwd Es gibt einen Eintrag wie:

testuser:1001:1003::/home/testuser:/bin/bash

Ich habe mir die bash(1) durchgelesen und ich denke, das Problem ist, dass bash denkt, dass es nicht als Login-Shell aufgerufen wird:

Wenn bash als interaktive Login-Shell oder als nicht-interaktive Shell mit der Option –login aufgerufen wird, liest und führt es zuerst Befehle aus der Datei
/etc/profile aus, falls diese Datei existiert.

Ich bekomme dieses bash tatsächlich von /usr/sbin/jk_chrootsh aufgerufen wird aber ich verstehe nicht, wie bash bestimmt, um welche Art von Shell es sich handelt und welche Startdateien sie ausführen soll.

Ich würde gerne sehen, ob ich das Problem beheben kann – aber ich verstehe nicht:

Woher weiß Bash, wie es aufgerufen wird?

ps:Ich habe mir auch login(1) angesehen ohne viel Glück.

Akzeptierte Antwort:

Normalerweise weiß Bash, dass es sich um eine Login-Shell handelt, denn wenn das Login-Programm sie aufruft, teilt es Bash mit, dass sein Name -bash ist . Dieser Name steht in argv[0] , das nullte Befehlszeilenargument, was normalerweise die Art und Weise ist, wie der Benutzer das Programm aufgerufen hat. Der anfängliche Bindestrich ist eine Konvention, um einer Shell mitzuteilen, dass es sich um eine Login-Shell handelt. Bash verhält sich auch als Login-Shell, wenn Sie ihr die Option --login übergeben oder -l . Siehe Unterschied zwischen Anmelde-Shell und Nicht-Anmelde-Shell? für weitere Details.

Ab Jailkit 2.16, jk_chrootsh liest den absoluten Pfad zur aufzurufenden Shell aus verschiedenen Quellen und übergibt diesen Pfad als argv[0] , und übergibt seine eigenen Befehlszeilenargumente an diese Shell. Im normalen Anwendungsfall, wo jk_chrootsh wird selbst in /etc/passwd verwendet , gibt es keine Möglichkeit, ein Argument wie -l zu übergeben . Da der absolute Pfad nicht mit - beginnt , gibt es keine Möglichkeit, jk_chrootsh zu erstellen Rufen Sie eine Login-Shell auf, ohne ein winziges Zwischenprogramm zu verwenden.

#include <unistd.h>
int main () {
    execl("/bin/bash", "-bash", NULL);
    return 127;
}

Ich hätte jk_chrootsh erwartet um eine einfache Möglichkeit zum Aufrufen einer Login-Shell zu haben. Ich schlage vor, eine Funktionsanfrage zu stellen.

Verwandte:Was macht ‚exec {fd}/watchdog‘ in Bash?
Linux
  1. Programmieren mit Bash:Syntax und Tools

  2. Wie überprüfe ich die Teilzeichenfolge in Shell Script Bash?

  3. So vergleichen Sie Zeichenfolgen in Bash Shell-Skripten

  4. CentOS / RHEL :So deaktivieren Sie den BASH-Shell-Verlauf

  5. Wie funktioniert cat << EOF in Bash?

So verwenden Sie den Declare-Befehl in der Linux Bash Shell

So installieren Sie Linux Bash Shell unter Windows 10

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in der Bash-Shell vorhanden ist

Wie verwende ich die Linux-Bash-Shell in Windows 10?

Woher weiß ich, ob ich eine verschachtelte Shell ausführe?

Gewusst wie:Unbegrenzter Bash/Shell-Verlauf?