Differenzia login interattivo e shell non interattivo non login


25

Sto cercando di differenziare questi quattro termini login, non login, interattivo e non interattivo :

  • interattivo - shell di accesso
  • interattivo - shell non di accesso
  • non interattivo: shell di accesso
  • non interattivo: shell non di accesso

A quanto mi risulta
interattivo - shell non di accesso : avvia il sistema, accedi al sistema e apri il terminale e
non interattivo - shell di accesso : telnet al sistema e accedi

Ma che dire di una shell di login interattiva?
Accede al sistema, apre il terminale virtuale ed effettua l'accesso? e
non interattivo - shell senza accesso, sta eseguendo script automatizzati in crontab?

Risposte:


38

L'unico vero malinteso che sembra avere riguarda ciò che costituisce una shell di login non interattiva.

Brevemente (vedi qui per maggiori dettagli), con esempi:

  • shell di accesso interattiva: ad esempio, accedi a un computer remoto ssh. In alternativa, vai a un tty sul tuo computer locale ( Ctrl+ Alt+ F1) e accedi lì.

  • shell interattiva non di accesso: apre un nuovo terminale.

  • shell non login non interattiva: esegue uno script. Tutti gli script vengono eseguiti nella propria subshell e questa shell non è interattiva. Si apre solo per eseguire lo script e si chiude immediatamente al termine dello script.

  • shell di login non interattiva: questo è estremamente raro e non ti piace incontrarlo. Un modo per lanciarne uno è echo command | ssh server. Quando sshviene avviato senza un comando (quindi sshinvece ssh commandche verrà eseguito commandsulla shell remota) avvia una shell di accesso. Se il valore stdindi sshnon è un tty, avvia una shell non interattiva. Questo è il motivo echo command | ssh serverper cui lancerà una shell di login non interattiva. Puoi anche iniziarne uno con bash -l -c command.

Se vuoi giocare con questo, puoi testare i vari tipi di shell come segue:

  • Questa shell è interattiva?

    Controlla il contenuto della $-variabile. Per le shell interattive, includerà i:

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
    
  • È una shell di login?

    Non esiste un modo portatile per verificarlo ma, per bash, puoi verificare se l' login_shellopzione è impostata:

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on
    

Mettendo tutto questo insieme, ecco uno di ogni possibile tipo di shell:

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on

Voglio chiarire che 1) Per me accedere a gui significa avviare il sistema, accedere al sistema e aprire il terminale 2) fare telnet o ssh è la shell di accesso interattiva significa che l'esempio che ho dato non-interactive login shellè sbagliato.
margherita,

@daisy grazie per il chiarimento; risposta modificata.
terdon,

va bene e la gui è irrilevante, shell interattiva non di accesso: basta aprire un nuovo terminale localmente o in remoto tramite telnet o ssh
daisy

@daisy sì, sembra giusto. Ma leggi attentamente anche la risposta di Muru poiché ciò spiega che, in sostanza, si tratta di una questione di semantica e influisce solo sui file di avvio letti dalla shell. Vedi anche qui per una panoramica ancora più completa dei diversi tipi di shell.
terdon,

Le shell di login non interattive non sono così rare, ad esempio git le usa, IIRC.
Quazgar

6

In sostanza, indipendentemente dal fatto che una shell sia login o meno, interattiva o meno, è esattamente per un motivo:

I file di inizializzazione e le opzioni predefinite impostate dipendono dal fatto che una shell sia login o meno e interattiva o meno.

Di conseguenza, se una shell è login o meno o interattiva o meno dipende solo dall'invocazione utilizzata: il nome esatto del comando e le opzioni.

Le due proprietà sono altrimenti ortogonali: indipendentemente dal fatto che una shell sia login o meno, non ha alcuna influenza sul determinare se è interattiva o meno.

Bash avvia una shell di accesso se una di queste è vera:

  • argv[0], il nome del comando come è stato invocato, inizia con a -
  • l' -lopzione è specificata

Simile, bash avvia una shell interattiva se una di queste è vera:

  • non è stato specificato un file da eseguire (ovvero, il comando non lo era bash some/file) o una stringa di comando da eseguire ( bash -c 'foo') (la condizione effettiva è un po 'più complessa, consultare il manuale)
  • l' -iopzione è stata specificata

In particolare (e paradossalmente), quest'ultimo implica che bash -ic 'foo'inizia una shell interattiva.

Quindi il seguente avvia un login, shell interattiva, anche se non ha nulla di interattivo e l'invocazione non ha nulla a che fare con il login:

bash -lic true

Il fatto che l'accesso tramite console o GUI avvii una shell di accesso (o forse no) è interamente un effetto del processo di accesso che utilizza la chiamata appropriata.

Le condizioni e gli effetti sono descritti in dettaglio nel manuale di bash, sezione File di avvio .


Una delle principali fonti di confusione è che esiste un altro significato comune per la shell "login":

La shell di accesso di un utente è la shell definita nella passwdvoce di quell'utente (che può provenire da /etc/passwdLDAP o da qualche altra fonte).

Il loginprogramma, SSH, ecc. Avviano questa shell come shell di login , nel senso inteso nel resto della risposta - con un -comando iniziale nel nome del comando, di solito. Se volessi essere particolarmente confuso, potresti dire:

Alcuni processi di accesso avviano la shell di accesso dell'utente come shell di accesso.

Si noti che l'accesso alla GUI avvia una shell di accesso semplicemente perché gli sviluppatori lo hanno ritenuto conveniente - LightDM esegue uno script all'accesso che ovviamente non è interattivo e certamente non dipende dalla shell di accesso dell'utente (nel secondo senso). Tuttavia, non dipendere dal display manager che avvia una shell di accesso - non tutti lo fanno, e da Wayland e GNOME, il processo di accesso non utilizza affatto script di shell.


3

Shell di accesso:

Il primo processo che viene eseguito con il nostro ID utente quando eseguiamo l'accesso a una sessione. Il processo di login dice alla shell di comportarsi come shell di login con una convenzione: passare l'argomento 0, che normalmente è il nome dell'eseguibile della shell, con un carattere "-" anteposto

Shell interattiva:

Legge i comandi dall'input dell'utente su un tty. Tra le altre cose, tale shell legge i file di avvio all'attivazione, visualizza un prompt e abilita il controllo dei processi per impostazione predefinita. L'utente può interagire con la shell. Una shell che esegue uno script è sempre una shell non interattiva.

In poche parole: la shell interattiva richiede l'input dell'utente, mentre la shell non interattiva è gestita da script e non richiede input dell'utente.


Quindi gli esempi forniti sono corretti.
Margherita,

Sì, Margherita sei nel posto giusto.
George Udosen,

1
@daisy no! La GUI non ha assolutamente nulla a che fare con esso. Si tratta di shell da riga di comando, non di shell grafiche (che esistono anche ma sono una bestia diversa).
terdon,

1
@George no, ci sono due errori: l'accesso tramite la GUI non avvia una shell di accesso (o qualsiasi altro tipo di shell pertinente) e l'accesso a un sistema remoto tramite telnet avvia una shell telnet, ma tramite ssh avvia un accesso interattivo conchiglia.
terdon,

1
@George in realtà, mi correggo. Alcuni gestori degli accessi alla GUI potrebbero avviare una shell di accesso per leggere .profile(ho pensato che si limitassero a sorgente .profilemanualmente, ma potrei sbagliarmi ).
terdon,

0

Vorrei menzionare che è possibile avviare una shell di login interattiva:

  1. eseguendo sudo /bin/logine digitando le tue credenziali
  2. esecuzione exec -l /bin/bash
  3. esecuzione su -
  4. e come le risposte sopra riportate, usando ssh e accedi a un computer remoto

Inoltre, puoi verificare (in bash) se la shell è login digitando echo $0e se l'output inizia con un trattino -, allora è una shell di login.

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.