Woher weiß bash, wie es aufgerufen wird?


7

Ich habe installiert jailkitauf Ubuntu 12.04und ich habe einen Benutzer Shell einzurichten /bin/bash- aber wenn es aufgerufen wird , läuft es /etc/bash.bashrcstatt/etc/profile

Wenn Sie es noch nicht verwendet jailkithaben, finden Sie hier das Wesentliche:

  1. Eine "inhaftierte" Version des Systemstamms wird irgendwo erstellt, z. B. / home / jail
  2. Die Home-Verzeichnisse der inhaftierten Benutzer werden in diesen Ordner wie / home / jail / home / testuser verschoben
  3. Relavante Konfigurationsdateien werden nach / home / jail / etc / - kopiert, einschließlich eines begrenzten / etc / passwd
  4. Programme, auf die Sie Zugriff gewähren möchten, werden in die entsprechenden Verzeichnisse wie / bin / bash kopiert
  5. Wenn sich ein inhaftierter Benutzer anmeldet, wird er in / etc / jail / chrootet und kann darüber keine Dateien sehen

Ich habe also einen testuser, der einen Eintrag /etc/passwdwie diesen hat:

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

In der Datei /home/jail/etc/passwdgibt es einen Eintrag wie:

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

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

Wenn bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der Option --login aufgerufen wird, werden zuerst Befehle aus der Datei / etc / profile gelesen und ausgeführt, sofern diese Datei vorhanden ist.

Ich verstehe , dass dies bashtatsächlich aufgerufen wird, /usr/sbin/jk_chrootshaber ich verstehe nicht, wie bashbestimmt wird, um welche Art von Shell es sich handelt und welche Startdateien ausgeführt werden sollen.

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

Woher weiß bash, wie es aufgerufen wird?

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


Antworten:


8

Normalerweise weiß bash, dass es sich um eine Login-Shell handelt, denn wenn das Login-Programm sie aufruft, teilt es bash mit, dass der Name lautet -bash. Dieser Name befindet sich in argv[0]dem nullten Befehlszeilenargument, das üblicherweise 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 Anmeldeshell handelt. Bash verhält sich auch als Login-Shell, wenn Sie die Option --loginoder übergeben -l. Siehe Unterschied zwischen Login-Shell und Nicht-Login-Shell? für mehr Details.

Liest ab Jailkit 2.16 jk_chrootshden absoluten Pfad zur Shell, der aus verschiedenen Quellen aufgerufen werden soll , und übergibt diesen Pfad als argv[0]und übergibt seine eigenen Befehlszeilenargumente an diese Shell. Im normalen Anwendungsfall, in dem jk_chrootshselbst verwendet wird /etc/passwd, gibt es keine Möglichkeit, ein Argument wie z -l. Da der absolute Pfad nicht mit beginnt -, gibt es keine Möglichkeit, jk_chrootsheine Anmeldeshell aufzurufen, ohne ein winziges Zwischenprogramm zu verwenden.

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

Ich hätte erwartet jk_chrootsh, dass es einfach ist, eine Login-Shell aufzurufen. Ich schlage vor, eine Funktionsanfrage zu stellen.


Vielen Dank an @Giles - Sie haben viel mit Jailshell recherchiert - auch wenn Sie die Quelle durchgesehen haben. Ich weis das zu schätzen.
CWD

@Giles - kannst du mich auf die Dokumentation verweisen, execvlweil jaikit verwendet execvund ich es schwer finde zu finden execvl- meintest du das execl?
CWD

@cwd Ja, ich meinte execl, sorry.
Gilles 'SO - hör auf böse zu sein'

@ Gilles Gilt für andere ausführbare Dateien dieselbe Methode wie für Symlink /sbin/reboot -> /bin/systemctl ? Ist dies die einzige Möglichkeit, wie eine ausführbare Datei ihren Aufruf erkennen kann?
Sergiy Kolodyazhnyy

1
@SergiyKolodyazhnyy 1. Ja. 2. Ja, in dem Sinne, dass diese Informationen nur übermittelt werden argv[0](ein Programm könnte im Prinzip argv[0]auf eine andere Weise finden, aber das wären immer noch die Informationen, die vom aufrufenden Prozess in übergeben werden argv[0]).
Gilles 'SO - hör auf böse zu sein'

6

loginRuft den Login-Befehl / die Shell des Benutzers auf, wobei argv[0]mit a begonnen wird -. Shells überprüfen ihre, argv[0]um festzustellen, ob sie als Login-Shell aufgerufen werden.

Wie @slm sagt, ist es im Abschnitt "Aufruf" des bashHandbuchs klar angegeben .

Darüber hinaus wie ein paar Muscheln csh, tcsh, ksh, zsh, yash, bashund einige Varianten des Almquist Shell die Unterstützung -lOption zu aktivieren loginModus , ohne dass mingle mit dem ersten Argumente. Dies wird von nicht verwendet login, aber Sie können es verwenden, wenn Sie eine Anmeldeshell aus etwas simulieren möchten (wie den meisten Shells), bei dem es schwierig ist, einen Befehl mit einem beliebigen Befehl auszuführen argv[0]. Ich habe gesehen, dass es von grafischen Login-Managern verwendet wird.


Komisch, dass du das Akzeptieren und die Upvotes bekommst und wir haben so ziemlich dasselbe gesagt 8-). Gute Antwort übrigens.
slm

2

Schauen Sie sich die Bash-Manpage an . Sie diskutieren die Unterschiede, wie es dort aufgerufen werden kann. Der Abschnitt heißt INVOCATION . Die zwei Hauptmethoden, mit denen es aufgerufen wird, sind eine Login-Shell ( bash -l) und eine interaktive Shell ( bash -i).

Schauen Sie sich diese anderen Fragen und Antworten zu Unix und Linux mit dem Titel an: Unterschied zwischen Login-Shell und Nicht-Login-Shell? . Es deckt ziemlich genau ab, worüber Sie fragen.


Ich stimme Ihrer Antwort zu, weil ich denke, dass sie viel von dem wiedergibt, was ich in der Frage gesagt habe. Ich habe sogar auf die Manpage bash(1)in der Frage verwiesen und sogar ein Zitat beigefügt. Hast du die ganze Frage gelesen? Es wird nicht gefragt, "wie ich bash aufrufe", sondern "woher weiß, wie bash aufgerufen wird" - zum Beispiel, wenn sich ein Benutzer beim System anmeldet - wie der Systemaufruf zu bash tatsächlich stattfindet ...
cwd

Ja, ich habe deine Frage gelesen. Sie haben gefragt, woher Bash weiß, wie es heißt. Sie sind das OP, also ist es ganz und gar Ihr Anruf. Der Abschnitt INVOCATION, den ich dachte, erklärte klar, dass es zwei Modi gibt, in denen Bash aufgerufen werden kann. Ich habe nicht versucht, Ihnen zu sagen, wie Sie per say anrufen sollen. Es ist schwer zu erklären, dass es zwei Methoden gibt, mit denen bash aufgerufen werden kann, ohne die Schalter -lund zu erwähnen -i. Abgesehen davon denke ich, dass Ihre Frage grundlegender ist. Sie fragen sich, welcher Mechanismus verwendet wird, um Bash in einem Szenario im Vergleich zum anderen aufzurufen. Verstehe ich dich richtig?
slm

Lesen Sie diese andere Frage durch, die ich gerade gepostet habe, und prüfen
Fragen

Übrigens, danke, dass du einen Kommentar hinterlassen hast, als du abgestimmt hast!
slm

Einige dieser Antworten erklären den Mechanismus, wie eine interaktive vs. Login-Shell erzeugt wird. Suchen Sie nach etwas mehr?
slm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.