Czy istnieją nieinteraktywne powłoki logowania?


14

Wiem, jaka jest różnica między powłokami interaktywnymi / nieinteraktywnymi a powłokami do logowania / bez logowania, ale wydaje się, że w praktyce nigdy nie będzie powłoki do nieinteraktywnego logowania, chyba że masz coś takiego /bin/bash --login some-script.shw skrypcie (a nawet wydaje się, że trochę dziwne). Czy to prawda, czy są one bardziej powszechne?


7
telnet towel.blinkenlights.nldla powłoki nieinteraktywnej ;-)
Martin Tournoij,

1
Odpowiedź na to pytanie jest krótka w ramach dłuższej odpowiedzi .
Wildcard

@CaptainMan: Patrząc na odpowiedzi, mamy dwa, które koncentrują się na całkiem różnych znaczeniach „interaktywny”. Czy w związku z tym możesz nieco rozszerzyć swoją odpowiedź, aby wyjaśnić, jakiego znaczenia używałeś podczas zadawania pytania?
cjs

Odpowiedzi:


10

Zakładam, że mówisz o koncepcji logowania Basha w stosunku do braku logowania i interaktywnych vs. nieinteraktywnych powłok Bash, jak opisano w sekcji Inwokacja strony podręcznika. (Różni się to od interpretacji w odpowiedzi Jamesa Youngmana na dowolne dowolne polecenie użyte jako „powłoka” (lub interpreter poleceń użytkownika) w passwd(5)pliku i to, czy ten program akceptuje wprowadzanie danych przez użytkownika; niektóre, na przykład /usr/sbin/nologin, oczywiście, nie. )

Masz rację, że /bin/bash --login some-script.shspowoduje to nieinteraktywne wywołanie Bash logowania, i może to być patologiczny przykład. Jest jeszcze jedna sprawa, być może niezbyt często, ale nie naprawdę dziwne, że produkuje nieinteraktywny powłoki logowania: ssh somehost < some-file. Tutaj sshduruchomi się Bash z argv[0]ustawionym na, -bashponieważ nie otrzymano polecenia do uruchomienia, co powoduje, że Bash uważa się za powłokę logowania, ale ponieważ stdin nie jest podłączony do terminala, Bash nie przejdzie w tryb interaktywny ( $-nie będzie zawierał i) .

(Osobiście sprawa ta wydaje się znacznie bardziej uzasadniona niż odwrotna sytuacja, ssh somehost somecommandktóra nie jest uważana za „powłokę logowania”, mimo że jest to nowy login, somehosttaki jak powyżej.)

Niedawno zrobiłem to, co powinienem był zrobić dawno temu i stworzyłem tabelę trybów Basha i jakie pliki init są uruchamiane . Jeśli uznasz to za mylące, weź to za serce, przynajmniej ja też. Zastanawia mnie, jaki był ich pierwotny cel, jeśli chodzi o zasady dotyczące .bashrcegzekucji.


1

Większość powłok logowania według liczby nowo zainstalowanych systemów jest nieinteraktywna, w rzeczywistości:

$ 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

Jasno /bin/bashi /bin/shtradycyjne muszle i są interaktywne. Ale wszystkie inne elementy na tej liście są nieinteraktywne. Jeśli czytasz listę i nie wiesz, co robi jedna z nich, możesz po prostu sprawdzić jej stronę podręcznika (na przykład man nologinlub man sync).

Co faktycznie robi polecenie

Patrząc na historię postów Kapitana Człowieka, widzę, że nie mają oni doświadczenia z Uniksem. Może więc pytanie w komentarzu dotyczące nieprzestrzegania dotyczyło wiersza poleceń u góry odpowiedzi, a nie tylko wyniku. Wyjaśnię również wiersz poleceń, mimo że jest to naprawdę nie na temat tego pytania.

Polecenie jest potokiem uniksowym . Potok jest łańcuchem poleceń - czytasz go od lewej do prawej - w którym wyjście pierwszego polecenia staje się wejściem drugiego, wyjście drugiego staje się wejściem trzeciego itd., Dopóki koniec rurociągu. Wynik ostatniego procesu jest wyświetlany na terminalu (chyba że został przekierowany). Aby uzyskać więcej informacji, zobacz wpis w Wikipedii dotyczący rurociągów powłokowych .

Jeśli nie rozumiesz, co robi potok, możesz po prostu uruchomić go w segmentach, aby zobaczyć, co się dzieje. Możesz także przeczytać stronę podręcznika poleceń, które są używane (tutaj awk, sorti uniq). W rzeczywistości powinieneś to zrobić teraz. Poczekam.

Uruchommy etapy potoku stopniowo (możesz to bezpiecznie zrobić na własnym systemie 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 ... ]

Powyższy wynik to po prostu zawartość siódmego pola z /etc/passwdpliku. Jest to baza danych (plik tekstowy), która informuje system, czym jest powłoka logowania wszystkich użytkowników. Jeśli chcesz dowiedzieć się więcej o tym, /etc/passwdpo prostu przeczytaj go (jest to świat do odczytu) i zajrzyj na stronę podręcznika (man 5 passwd).

Więc czytając całą listę, możesz dowiedzieć się, jakie są popularne przedmioty, ale to nie jest dobry format odpowiedzi na to pytanie, ponieważ tak naprawdę chodziło o to, jak popularne są nieinteraktywne powłoki. Policzmy je. Najprostszym sposobem na to jest posortowanie elementów w pierwszej kolejności:

~$ 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 ... ]

Możemy użyć programu, uniqaby pokazać nam tylko unikalne elementy:

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

Ale czekaj, to nie ma sensu, ile ich było? Zapytajmy uniq(przeczytaj stronę podręcznika!):

~$ 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

To oczywiście wynik, który widzieliśmy u góry odpowiedzi. Posortujmy to jeszcze raz, aby zobaczyć wpisy w kolejności:

~$ 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

Poczekaj, to nie może być prawda, 17 pojawia się przed 1, a 5 po 23. Problem polega na tym, że przedmioty są sortowane leksykograficznie . Poprośmy o sortposortowanie ich numerycznie i w odwrotnej kolejności:

~$ 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

Myślę, że to wyjaśnia wszystko w oryginalnej odpowiedzi. Jeśli nadal nie masz pewności co do szczegółów działania tych poleceń, możesz przeczytać strony podręcznika. Jeśli nadal nie masz pewności co do zasad tego, co się dzieje, lepiej zacząć od przeczytania książki (online lub na papierze) wyjaśniającej Unixa i Linuksa.


Czy możesz wyjaśnić coś więcej, proszę? Nie jestem pewien, czy śledzę to, co czytam.
Captain Man

jest /bin/syncskorupa? więc jakieś narzędzie jest powłoką?
eloone 21.04.16

@eloone istnieją dwa (może trzy) znaczenia słowa „shell”. Po pierwsze, programy skonfigurowane jako powłoka logowania w bazie danych haseł. To jest znaczenie słowa zamierzonego przez wyrażenie „nieinteraktywna powłoka logowania”. Innym znaczeniem jest „REPL odpowiedni do codziennej interaktywnej pracy w systemie Unix”. Te są interaktywne. Jednak większość programów użytecznych w kontekście REPL obsługuje także nieinteraktywne użycie jako interpretatory dla pewnego rodzaju języka skryptowego (chociaż „skrypt powłoki” prawie powszechnie oznacza „skrypt powłoki rodziny Bourne'a”).
James Youngman

2
Wygląda na to, że odpowiadasz na inne pytanie. Wymieniasz tylko dostępne powłoki i zaznaczasz, że niektóre nigdy nie będą interaktywne. Uważam, że OP pyta, czy kiedykolwiek nie spotkała się nieinteraktywna powłoka logowania na wolności. Tak więc, czy powłoki, które mogą być interaktywne, na przykład bash, zawsze uruchamiają nieinteraktywne powłoki logowania . Innymi słowy, „powłoka logowania” tutaj nie oznacza „domyślnej powłoki logowania użytkownika”, oznacza powłokę, która została uruchomiona jako powłoka logowania . Zobacz unix.stackexchange.com/a/46856/22222
terdon

1
A może, biorąc pod uwagę, że plakat wyraźnie pisze bash --loginw pytaniu, pyta konkretnie o bashprocesy, które nie mają iustawionej opcji. (Powstają one z poleceń takich jak ssh somehost < script.sh; będzie to powłoka „login, nieinteraktywna” w sensie określonym w sekcji INVOCATION na stronie podręcznika Bash.)
cjs 14.10.17
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.