Ich habe installiert jailkit
auf Ubuntu 12.04
und ich habe einen Benutzer Shell einzurichten /bin/bash
- aber wenn es aufgerufen wird , läuft es /etc/bash.bashrc
statt/etc/profile
Wenn Sie es noch nicht verwendet jailkit
haben, finden Sie hier das Wesentliche:
- Eine "inhaftierte" Version des Systemstamms wird irgendwo erstellt, z. B. / home / jail
- Die Home-Verzeichnisse der inhaftierten Benutzer werden in diesen Ordner wie / home / jail / home / testuser verschoben
- Relavante Konfigurationsdateien werden nach / home / jail / etc / - kopiert, einschließlich eines begrenzten / etc / passwd
- Programme, auf die Sie Zugriff gewähren möchten, werden in die entsprechenden Verzeichnisse wie / bin / bash kopiert
- 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/passwd
wie diesen hat:
testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh
In der Datei /home/jail/etc/passwd
gibt 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 bash
tatsächlich aufgerufen wird, /usr/sbin/jk_chrootsh
aber ich verstehe nicht, wie bash
bestimmt 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:
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 inargv[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--login
oder übergeben-l
. Siehe Unterschied zwischen Login-Shell und Nicht-Login-Shell? für mehr Details.Liest ab Jailkit 2.16
jk_chrootsh
den absoluten Pfad zur Shell, der aus verschiedenen Quellen aufgerufen werden soll , und übergibt diesen Pfad alsargv[0]
und übergibt seine eigenen Befehlszeilenargumente an diese Shell. Im normalen Anwendungsfall, in demjk_chrootsh
selbst 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_chrootsh
eine Anmeldeshell aufzurufen, ohne ein winziges Zwischenprogramm zu verwenden.Ich hätte erwartet
jk_chrootsh
, dass es einfach ist, eine Login-Shell aufzurufen. Ich schlage vor, eine Funktionsanfrage zu stellen.quelle
execvl
weil jaikit verwendetexecv
und ich es schwer finde zu findenexecvl
- meintest du dasexecl
?execl
, sorry./sbin/reboot -> /bin/systemctl
? Ist dies die einzige Möglichkeit, wie eine ausführbare Datei ihren Aufruf erkennen kann?argv[0]
(ein Programm könnte im Prinzipargv[0]
auf eine andere Weise finden, aber das wären immer noch die Informationen, die vom aufrufenden Prozess in übergeben werdenargv[0]
).login
Ruft den Login-Befehl / die Shell des Benutzers auf, wobeiargv[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
bash
Handbuchs klar angegeben .Darüber hinaus wie ein paar Muscheln
csh
,tcsh
,ksh
,zsh
,yash
,bash
und einige Varianten des Almquist Shell die Unterstützung-l
Option zu aktivierenlogin
Modus , ohne dass mingle mit dem ersten Argumente. Dies wird von nicht verwendetlogin
, 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ührenargv[0]
. Ich habe gesehen, dass es von grafischen Login-Managern verwendet wird.quelle
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.
quelle
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 ...-l
und 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?