Quello che ho fatto qui è di verificare se la radice del initprocesso (PID 1) è la stessa della radice del processo corrente. Sebbene /proc/1/rootsia sempre un collegamento /(a meno che non initsia esso stesso chroot, ma non è un caso a cui tengo), seguirlo porta alla directory principale "master". Questa tecnica è usata in alcuni script di manutenzione in Debian, ad esempio per saltare l'avvio di udev dopo l'installazione in un chroot.
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(A proposito, questo è ancora un altro esempio del perché chrootè inutile per la sicurezza se il processo chroot ha accesso root. I processi non root non possono leggere /proc/1/root, ma possono seguire /proc/1234/rootse c'è un processo in esecuzione con PID 1234 in esecuzione come lo stesso utente.)
Se non si dispone dei permessi di root, è possibile consultare /proc/1/mountinfoe /proc/$$/mountinfo(brevemente documentato nella documentazione filesystems/proc.txtdel kernel Linux ). Questo file è leggibile in tutto il mondo e contiene molte informazioni su ciascun punto di montaggio nella vista del processo del filesystem. I percorsi in quel file sono limitati dal chroot che influenza il processo di lettura, se presente. Se la lettura del processo /proc/1/mountinfoviene eseguita il chroot in un filesystem diverso dalla radice globale (supponendo che la radice di pid 1 sia la radice globale), allora non /appare alcuna voce per /proc/1/mountinfo. In caso la lettura processo /proc/1/mountinfoè chroot in una directory sul filesystem di root globale, allora una voce per /appare in /proc/1/mountinfo, ma con un diverso montaggio id. Per inciso, il campo radice ($4) indica dove si trova il chroot nel suo filesystem principale.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Questa è una pura soluzione Linux. Potrebbe essere generalizzabile ad altre varianti di Unix con una sufficientemente simile /proc(Solaris ha una simile /proc/1/root, penso, ma non mountinfo).