Ci sono shell di login non interattive?


14

So qual è la differenza tra shell interattive / non interattive e login / non login, ma in pratica sembra che non ci sarà mai una shell di accesso non interattiva a meno che tu non abbia qualcosa di simile /bin/bash --login some-script.shin uno script (e anche quello sembra un po 'strano). È corretto o sono più comuni?


7
telnet towel.blinkenlights.nlper una shell di login non interattiva ;-)
Martin Tournoij,

1
A questa domanda viene data una breve risposta all'interno di questa risposta più lunga .
Wildcard il

@CaptainMan: guardando le risposte, ne abbiamo due focalizzate su significati piuttosto diversi di "interattivo". Alla luce di ciò, puoi espandere un po 'la tua risposta per spiegare quale significato stavi usando quando hai posto la domanda?
Curt J. Sampson,

Risposte:


10

Presumo che tu stia parlando del concetto di shell Bash di login rispetto a non login e interattivo e non interattivo come descritto nella sezione Invocazione della pagina man. (Questo è diverso dall'interpretazione nella risposta di James Youngman di qualsiasi comando arbitrario usato come "shell" (o interprete di comandi utente) nel passwd(5)file e se quel programma accetta o meno l'input dell'utente; alcuni, come /usr/sbin/nologinovviamente, non lo fanno. )

Hai ragione che /bin/bash --login some-script.shprodurrà una chiamata Bash di login non interattiva, e questo è forse un esempio patologico. V'è un caso, forse poco comune ma non è veramente strano, che produce una shell di login non interattiva: ssh somehost < some-file. Qui sshdavvierà Bash con argv[0]set su -bashperché non gli è stato dato un comando da eseguire, facendo sì che Bash si consideri una shell di login, ma, poiché stdin non è collegato a un terminale, Bash non si imposterà in modalità interattiva ( $-non conterrà i) .

(Personalmente, quel caso sembra molto più ragionevole del contrario, ssh somehost somecommandche non è considerato una "shell di login" anche se si tratta di un nuovo login somehostesattamente come sopra.)

Di recente ho fatto quello che avrei dovuto fare molto tempo fa e ho messo insieme una tabella delle modalità di Bash e quali file init sono in esecuzione . Se lo trovi confuso, prendi il cuore almeno in quello che faccio anch'io. Mi confonde quale fosse il loro obiettivo originale con le regole su quando veniva .bashrceseguito.


1

La maggior parte delle shell di login in base al conteggio su un sistema appena installato non sono interattive, in realtà:

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

Chiaramente /bin/bashe /bin/shsono conchiglie tradizionali e sono interattive. Ma tutti gli altri elementi in quell'elenco non sono interattivi. Se stai leggendo l'elenco e non sai cosa fa uno di loro, puoi semplicemente cercare la sua pagina di manuale (con ad esempio man nologino man sync).

Cosa fa effettivamente il comando

Guardando la storia dei post di Captain Man vedo che sono abbastanza inesperti con Unix. Quindi forse la domanda nel commento sul non seguire si riferiva alla riga di comando nella parte superiore della risposta, non semplicemente all'output. Quindi spiegherò anche la riga di comando, anche se è davvero fuori tema per questa domanda.

Il comando è una pipeline Unix . Una pipeline è una catena di comandi - la leggi da sinistra a destra - in cui l'output del primo comando diventa l'input del secondo, l'output del secondo diventa l'input del terzo e così via, fino a quando il fine della pipeline. L'output dell'ultimo processo è mostrato sul terminale (a meno che non sia stato reindirizzato). Vedere la voce di Wikipedia sulle pipeline di shell per ulteriori informazioni.

Se non capisci cosa sta facendo una pipeline, puoi semplicemente eseguirla in segmenti per vedere cosa sta succedendo. È inoltre possibile leggere la pagina di manuale per i comandi utilizzati (qui awk, sorte uniq). In effetti, dovresti farlo ora. Aspetterò.

Eseguiamo le fasi della pipeline in modo incrementale (puoi farlo tranquillamente sul tuo sistema Unix):

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

L'output sopra è semplicemente il contenuto del settimo campo dal /etc/passwdfile. Questo è il database (flat-text-file) che dice al sistema quale sia la shell di accesso di tutti. Se vuoi saperne di più /etc/passwdbasta andare a leggerlo (è leggibile in tutto il mondo) e consultare la pagina di manuale per questo (man 5 passwd).

Quindi leggendo l'intero elenco lì puoi avere un'idea di quali sono gli elementi popolari, ma non è un buon formato per una risposta a questa domanda, perché la domanda riguardava davvero le comuni shell non interattive. Contiamoli. Il modo più semplice per farlo è ordinare prima gli oggetti:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

Possiamo usare il programma uniqper mostrarci solo gli oggetti unici:

~ $ awk -F: '{print $ 7}' </ etc / passwd | ordina | uniq | sed -e 's / ^ / /' / bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin

Ma aspetta, non serve a niente, quanti ce n'erano? Chiediamo uniq(leggi la pagina man!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

Questo è l'output che abbiamo visto in cima alla risposta, ovviamente. Ordiniamolo di nuovo per vedere le voci in ordine:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

Aspetta, non può essere giusto, 17 viene prima di 1 e 5 dopo 23. Il problema è che gli articoli vengono ordinati lessicograficamente . Chiediamo sortdi ordinarli numericamente e in ordine inverso:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

Penso che spieghi tutto nella risposta originale. Se non sei ancora chiaro sui dettagli di ciò che fanno quei comandi, puoi leggere le pagine del manuale. Se non sei ancora chiaro sui principi di ciò che sta succedendo, potrebbe essere meglio iniziare leggendo un libro (online o su carta) che spiega Unix e Linux.


Puoi spiegarci un po 'di più, per favore? Non sono sicuro di seguire ciò che sto leggendo.
Captain Man

è /bin/syncuna conchiglia? quindi ogni utilità è una shell?
eloone,

@eloone ci sono due (forse tre) significati per "shell". Uno è, i programmi configurati come shell di accesso nel database delle password. Questo è il significato della parola intesa con la frase "shell di login non interattiva". L'altro significato è "un REPL adatto al lavoro interattivo quotidiano su un sistema Unix". Quelli sono interattivi. Tuttavia, la maggior parte dei programmi utilizzabili nel contesto REPL supporta anche un uso non interattivo come interpreti per un qualche tipo di linguaggio di scripting (anche se "script di shell" significa quasi universalmente "script di shell di famiglia Bourne").
James Youngman,

2
Sembra che tu stia rispondendo a una domanda diversa. Stai solo elencando le shell disponibili e sottolineando che alcune non saranno mai interattive. Credo che l'OP stia chiedendo se una shell di login non interattiva sia mai stata incontrata in natura. Quindi, se le shell che possono essere interattive, bash per esempio, avviano mai shell di login non interattive . In altre parole, una "shell di login" qui, non significa "shell di login predefinita di un utente", significa una shell che è stata lanciata come shell di login . Vedi unix.stackexchange.com/a/46856/22222
terdon

1
O forse, dato che il poster scrive esplicitamente bash --loginnella domanda, si sta chiedendo specificamente sui bashprocessi che non hanno l' iopzione impostata. (Questi derivano da comandi come ssh somehost < script.sh: questa sarà una shell "login, non interattiva" nei sensi specificati nella sezione INVOCATION della manpage di Bash.)
Curt J. Sampson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.