Ho installato jailkit su Ubuntu 12.04 e ho impostato la shell di un utente su /bin/bash – ma quando viene invocato esegue /etc/bash.bashrc invece di /etc/profile
Se non hai utilizzato jailkit prima ecco il succo di esso:
- Una versione "prigionata" della radice di sistema viene creata da qualche parte, come /home/jail
- Le home directory degli utenti in carcere vengono spostate all'interno di quella cartella come /home/jail/home/testuser
- I file di configurazione relativi vengono copiati in /home/jail/etc/, incluso un /etc/passwd limitato
- I programmi a cui vuoi consentire l'accesso vengono copiati nelle directory corrispondenti, come
/bin/bash - Quando un utente incarcerato effettua l'accesso, viene eseguito il chroot su /etc/jail/ e non può vedere nessun file al di sopra di quello
Quindi ho un testuser chi ha una voce in /etc/passwd così:
testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh
Nel file /home/jail/etc/passwd c'è una voce come:
testuser:1001:1003::/home/testuser:/bin/bash
Ho letto il bash(1) e quindi penso che il problema sia che bash pensa che non venga invocato come shell di accesso:
Quando bash viene invocato come shell di accesso interattiva, o come shell non interattiva con l'opzione –login, prima legge ed esegue i comandi dal file
/etc/profile, se quel file esiste.
Ho quel bash viene effettivamente invocato da /usr/sbin/jk_chrootsh ma non capisco come bash sta determinando che tipo di shell è e quale set di file di avvio dovrebbe eseguire.
Mi piacerebbe vedere se riesco a risolvere questo problema, ma non capisco:
Come fa bash a sapere come viene invocato?
ps:ho anche esaminato login(1) senza molta fortuna.
Risposta accettata:
Normalmente bash sa che è una shell di login perché quando il programma di login la invoca, dice a bash che il suo nome è -bash . Quel nome è in argv[0] , l'argomento zero della riga di comando, che è convenzionalmente il modo in cui l'utente ha richiamato il programma. Il trattino iniziale è una convenzione per dire a una shell che è una shell di login. Bash si comporta anche come una shell di login se gli passi l'opzione --login o -l . Vedi la differenza tra Shell di accesso e Shell non di accesso? per maggiori dettagli.
A partire da Jailkit 2.16, jk_chrootsh legge il percorso assoluto della shell da invocare da varie fonti e passa questo percorso come argv[0] e passa i propri argomenti della riga di comando a quella shell. Nel normale caso d'uso in cui jk_chrootsh è esso stesso utilizzato in /etc/passwd , non c'è modo di passare un argomento come -l . Poiché il percorso assoluto non inizia con - , non c'è modo di creare jk_chrootsh invoca una shell di login, a meno di usare un minuscolo programma intermedio.
#include <unistd.h>
int main () {
execl("/bin/bash", "-bash", NULL);
return 127;
}
Mi sarei aspettato jk_chrootsh per avere un modo semplice per invocare una shell di accesso. Suggerisco di fare una richiesta di funzionalità.