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:
- Irgendwo wird eine „eingesperrte“ Version des Systemstammverzeichnisses erstellt, z. B. /home/jail
- Home-Verzeichnisse von inhaftierten Benutzern werden in diesen Ordner verschoben, wie /home/jail/home/testuser
- Relevante Konfigurationsdateien werden nach /home/jail/etc/ kopiert – einschließlich eines begrenzten /etc/passwd
- Programme, denen Sie den Zugriff erlauben möchten, werden in die entsprechenden Verzeichnisse kopiert, wie
/bin/bash - 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.