Ich habe hier getestet, ob die Wurzel des initProzesses (PID 1) mit der Wurzel des aktuellen Prozesses identisch ist. Obwohl /proc/1/rootes sich immer um einen Link handelt /(es sei denn, er initselbst ist chrooted, aber das interessiert mich nicht), führt das Befolgen dieses Links zum Stammverzeichnis „master“. Diese Technik wird in einigen Wartungsskripten in Debian verwendet, um beispielsweise das Starten von udev nach der Installation in einer Chroot zu überspringen.
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(Übrigens ist dies ein weiteres Beispiel dafür, warum die chrootSicherheit unbrauchbar ist, wenn der Chroot-Prozess über Root-Zugriff verfügt. Nicht-Root-Prozesse können nicht lesen /proc/1/root, aber sie können folgen, /proc/1234/rootwenn ein Prozess mit der gleichen PID 1234 ausgeführt wird Benutzer.)
Wenn Sie nicht über Root-Berechtigungen verfügen, können Sie nachsehen /proc/1/mountinfound /proc/$$/mountinfo( filesystems/proc.txtin der Dokumentation zum Linux-Kernel kurz dokumentiert ). Diese Datei ist weltweit lesbar und enthält viele Informationen zu jedem Einhängepunkt in der Prozessansicht des Dateisystems. Die Pfade in dieser Datei werden durch die Chroot eingeschränkt, die sich gegebenenfalls auf den Leseprozess auswirkt. Wenn der Prozesslesevorgang /proc/1/mountinfoin ein Dateisystem verschoben wird, das sich vom globalen Stamm unterscheidet (vorausgesetzt, der Stamm von PID 1 ist der globale Stamm), wird in kein Eintrag für /angezeigt /proc/1/mountinfo. Wenn die Prozesslesung /proc/1/mountinfoin ein Verzeichnis im globalen Root-Dateisystem verschoben wird, wird ein Eintrag für in /angezeigt /proc/1/mountinfo, jedoch mit einer anderen Mount-ID. Übrigens ist das Wurzelfeld ($4) gibt an, wo sich die Chroot in ihrem Master-Dateisystem befindet.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Dies ist eine reine Linux-Lösung. Es ist möglicherweise verallgemeinerbar auf andere Unix-Varianten mit einer hinreichend ähnlichen /proc(Solaris hat eine ähnliche /proc/1/root, denke ich, aber nicht mountinfo).