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à.