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?

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

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.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.