Zróżnicuj interaktywne logowanie i nieinteraktywną powłokę niezalogowaną

25

Próbuję rozróżnić te cztery warunki logowania, braku logowania, interaktywne i nieinteraktywne :

  • interaktywna - powłoka logowania
  • interaktywna - powłoka niezalogowana
  • nieinteraktywna - powłoka logowania
  • nieinteraktywna - powłoka niezalogowana

Jak rozumiem
interaktywna - powłoka bez logowania : Uruchom system, zaloguj się do systemu i otwórz terminal oraz
nieinteraktywna - zaloguj powłokę : telnet do systemu i zaloguj się

Ale co z interaktywną powłoką logowania?
Czy loguje się do systemu, otwiera terminal wirtualny i loguje się? i
nieinteraktywna - powłoka niezalogowana, czy działa automatyczny skrypt w crontab?

stokrotka
źródło

Odpowiedzi:

38

Jedyne prawdziwe nieporozumienie, jakie wydaje się mieć, dotyczy tego, co stanowi nieinteraktywną powłokę logowania.

Krótko (patrz tutaj po więcej szczegółów), wraz z przykładami:

  • interaktywna powłoka logowania: na przykład logujesz się do zdalnego komputera ssh. Możesz też upuścić się na tty na lokalnym komputerze ( Ctrl+ Alt+ F1) i zalogować się tam.

  • interaktywna powłoka niezalogowana: Otwórz nowy terminal.

  • nieinteraktywna powłoka niezalogowana: Uruchom skrypt. Wszystkie skrypty działają we własnej podpowłoce i ta powłoka nie jest interaktywna. Otwiera się tylko w celu wykonania skryptu i zamyka natychmiast po zakończeniu skryptu.

  • nieinteraktywna powłoka logowania: Jest to niezwykle rzadkie i raczej nie spotkasz jej. Jednym ze sposobów uruchomienia jest echo command | ssh server. Kiedy sshjest uruchamiany bez polecenia (więc sshzamiast niego ssh commandbędzie działał commandna zdalnej powłoce), uruchamia powłokę logowania. Jeśli stdinz sshnie jest tty, uruchamia nieinteraktywną powłokę. Dlatego echo command | ssh serveruruchomi nieinteraktywną powłokę logowania. Możesz także zacząć od bash -l -c command.

Jeśli chcesz się tym pobawić, możesz przetestować różne typy powłok w następujący sposób:

  • Czy ta powłoka jest interaktywna?

    Sprawdź zawartość $-zmiennej. W przypadku powłok interaktywnych będzie to obejmować i:

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • Czy to powłoka logowania?

    Nie ma przenośnego sposobu na sprawdzenie tego, ale dla bash możesz sprawdzić, czy login_shellopcja jest ustawiona:

    ## 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

Podsumowując, oto jeden z możliwych typów powłok:

## 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
terdon
źródło
Chcę wyjaśnić, że 1) Dla mnie logowanie do GUI oznacza uruchomienie systemu, logowanie do systemu i otwarcie terminala 2) wykonywanie telnet lub ssh to interaktywna powłoka logowania oznacza, że ​​podany przykład non-interactive login shelljest błędny.
stokrotka
@ Daisy dzięki za wyjaśnienie; odpowiedź edytowana.
terdon
ok, a GUI jest nieistotne, interaktywna powłoka niezalogowana: po prostu otwórz nowy terminal lokalnie lub zdalnie za pośrednictwem telnet lub ssh
daisy
@ stokrotka tak, brzmi dobrze. Ale proszę również uważnie przeczytać odpowiedź Muru, ponieważ wyjaśnia to, że zasadniczo jest to kwestia semantyki i wpływa tylko na to, jakie pliki startowe są odczytywane przez powłokę. Zobacz także tutaj, aby uzyskać bardziej kompleksowy przegląd różnych typów powłok.
terdon
Nieinteraktywne powłoki logowania nie są rzadkie, na przykład git używa ich, IIRC.
quazgar
6

Zasadniczo, czy powłoka jest zalogowana czy nie, interaktywna czy nie ma znaczenia z dokładnie jednego powodu:

Pliki inicjujące i ustawione opcje domyślne zależą od tego, czy powłoka jest zalogowana, czy nie, i interaktywna.

Odpowiednio to, czy powłoka jest loginem czy nie, czy interaktywna, czy nie, zależy wyłącznie od wywołania użytego - dokładnej nazwy polecenia i opcji.

Te dwie właściwości są prostopadłe - niezależnie od tego, czy powłoka jest loginem, czy nie, nie ma wpływu na to, czy jest interaktywna, czy nie.

Bash uruchamia powłokę logowania, jeśli którykolwiek z nich jest prawdziwy:

  • argv[0], nazwa polecenia, które zostało wywołane jako, zaczyna się od -
  • -lopcja jest określona

Podobnie, bash uruchamia interaktywną powłokę, jeśli którykolwiek z nich jest prawdziwy:

  • nie określono pliku do wykonania (tj. polecenie nie było bash some/file) lub ciągu polecenia do uruchomienia (bash -c 'foo' ) (rzeczywisty warunek jest nieco bardziej złożony, patrz instrukcja)
  • -iopcja została podana

W szczególności (i paradoksalnie) to drugie implikuje to bash -ic 'foo' uruchomienie interaktywnej powłoki.

Tak więc poniższe polecenie uruchamia interaktywną powłokę logowania, mimo że nie ma w tym nic interaktywnego, a wywołanie nie miało nic wspólnego z logowaniem:

bash -lic true

To, że logowanie za pomocą konsoli lub GUI uruchamia powłokę logowania (a może nie) jest całkowicie efektem procesu logowania przy użyciu odpowiedniego wywołania.

Warunki i efekty są szczegółowo opisane w podręczniku bash, sekcja Pliki startowe .


Głównym źródłem nieporozumień jest to, że istnieje inne wspólne znaczenie dla powłoki „login”:

Powłoka logowania użytkownika to powłoka zdefiniowana we passwdwpisie tego użytkownika (która może pochodzić z /etc/passwdLDAP lub innego źródła).

loginProgramu SSH itp rozpocząć tę skorupę jako logowania powłoki w sensie oznaczało w pozostałej części odpowiedzi - z wiodącym -w nazwie polecenia zwykle. Jeśli chcesz być szczególnie zagubiony, możesz powiedzieć:

Niektóre procesy logowania uruchamiają powłokę logowania użytkownika jako powłokę logowania.

Zauważ, że logowanie GUI uruchamia powłokę logowania wyłącznie dlatego, że programiści uznali to za wygodne - LightDM uruchamia skrypt przy logowaniu, który oczywiście nie jest interaktywny i na pewno nie zależy od powłoki logowania użytkownika (w drugim tego słowa znaczeniu). Nie należy jednak polegać na tym, że menedżer wyświetlania uruchamia powłokę logowania - nie wszystkie - i w przypadku Wayland i GNOME proces logowania w ogóle nie używa skryptów powłoki.

muru
źródło
3

Powłoka logowania:

Pierwszy proces wykonywany przy użyciu naszego identyfikatora użytkownika po zalogowaniu się do sesji. Proces logowania mówi powłoce, aby zachowywała się jak powłoka logowania z konwencją: przekazanie argumentu 0, który zwykle jest nazwą pliku wykonywalnego powłoki, z poprzedzonym znakiem „-”

Interaktywna powłoka:

Czyta polecenia z danych wprowadzanych przez użytkownika na urządzeniu tty. Między innymi taka powłoka odczytuje pliki startowe podczas aktywacji, wyświetla monit i domyślnie włącza kontrolę zadań. Użytkownik może wchodzić w interakcje z powłoką. Powłoka uruchamiająca skrypt jest zawsze powłoką nieinteraktywną.

Mówiąc wprost: powłoka interaktywna wymaga danych wejściowych od użytkownika, podczas gdy powłoka nieinteraktywna jest uruchamiana przez skrypty i nie wymaga danych wejściowych od użytkownika.

George Udosen
źródło
Podane przykłady są prawidłowe.
stokrotka
Tak, stokrotka jest we właściwym miejscu.
George Udosen
1
@daisy no! GUI nie ma z tym absolutnie nic wspólnego. Chodzi o powłoki wiersza poleceń, a nie powłoki graficzne (które również istnieją, ale są inną bestią).
terdon
1
@George nie, są dwa błędy: logowanie za pomocą GUI nie uruchamia powłoki logowania (lub innego rodzaju odpowiedniej powłoki) i logowanie do zdalnego systemu za pomocą telnet uruchamia powłokę telnet, ale poprzez ssh uruchamia się interaktywne logowanie muszla.
terdon
1
@George właściwie, poprawiam się. Niektórzy menedżerowie logowania do GUI mogą uruchomić powłokę logowania do odczytu .profile(myślałem, że po prostu dokonują .profileręcznego źródła , ale mogę się mylić ).
terdon
0

Chciałbym wspomnieć, że możesz uruchomić interaktywną powłokę logowania przez:

  1. wykonywanie sudo /bin/logini wpisywanie poświadczeń
  2. wykonywanie exec -l /bin/bash
  3. wykonywanie su -
  4. i jak wyżej wymienione odpowiedzi, używając ssh i zaloguj się do zdalnego komputera

Możesz również sprawdzić (w bash), czy powłoka jest zalogowana, wpisując, echo $0a jeśli dane wyjściowe zaczynają się od myślnika -, to jest to powłoka logowania.

SantaXL
źródło