GNU/Linux >> Linux Esercitazione >  >> Linux

Come fa Bash a sapere come viene invocato?

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:

  1. Una versione "prigionata" della radice di sistema viene creata da qualche parte, come /home/jail
  2. Le home directory degli utenti in carcere vengono spostate all'interno di quella cartella come /home/jail/home/testuser
  3. I file di configurazione relativi vengono copiati in /home/jail/etc/, incluso un /etc/passwd limitato
  4. I programmi a cui vuoi consentire l'accesso vengono copiati nelle directory corrispondenti, come
    /bin/bash
  5. 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à.

Correlati:cosa fa 'exec {fd}/watchdog' in Bash?
Linux
  1. Come programmare con Bash:sintassi e strumenti

  2. Lo scopo di .bashrc e come funziona?

  3. Come controllare la sottostringa in Shell Script Bash?

  4. Come fare eco a una nuova riga negli script di Bash Shell

  5. CentOS / RHEL:come disabilitare la cronologia della shell BASH

Come utilizzare il comando Declare in Linux Bash Shell

Come installare Linux Bash Shell su Windows 10

Come verificare se esiste un file o una directory in Bash Shell

Come utilizzare Linux Bash Shell in Windows 10?

Procedura:cronologia Bash/shell illimitata?

In che modo bash verifica "false"?