Gibt es nicht interaktive Login-Shells?

14

Ich weiß, was der Unterschied zwischen interaktiven / nicht interaktiven und Anmelde- / Nicht-Anmelde-Shells ist, aber in der Praxis scheint es nie eine nicht interaktive Anmelde- Shell zu geben, es sei denn, Sie haben so etwas wie /bin/bash --login some-script.shein Skript (und selbst das scheint so) ein bisschen seltsam). Ist das richtig oder sind sie häufiger?

Captain Man
quelle
7
telnet towel.blinkenlights.nlfür eine Login-Shell, die nicht interaktiv ist ;-)
Martin Tournoij
1
Diese Frage wird in dieser längeren Antwort kurz beantwortet .
Wildcard
@CaptainMan: Bei den Antworten haben wir zwei, die sich auf ganz unterschiedliche Bedeutungen von "interaktiv" konzentrieren. Können Sie in Anbetracht dessen Ihre Antwort etwas erweitern, um zu erklären, welche Bedeutung Sie bei der Beantwortung der Frage verwendet haben?
Curt J. Sampson

Antworten:

10

Ich gehe davon aus, dass Sie über Bashs Konzept von Login vs. Non-Login und Interactive vs. Non-Interactive Bash-Shells sprechen, wie im Abschnitt Invocation der Manpage beschrieben. (Dies unterscheidet sich von der Interpretation in James Youngmans Antwort auf einen beliebigen Befehl, der als "Shell" (oder Interpreter für Benutzerbefehle) in der passwd(5)Datei verwendet wird, und davon, ob dieses Programm Benutzereingaben akzeptiert oder /usr/sbin/nologinnicht. )

Sie haben Recht, dass /bin/bash --login some-script.shein nicht interaktiver Login-Bash-Aufruf erzeugt wird, und dies ist möglicherweise ein pathologisches Beispiel. Es gibt einen Fall, vielleicht ungewöhnlich , aber nicht wirklich seltsam, dass ein nicht-interaktiv Login - Shell produziert: ssh somehost < some-file. Hier sshdwird Bash mit argv[0]set to gestartet , -bashda ihm kein Befehl zum Ausführen gegeben wurde, wodurch Bash sich selbst als Anmeldeshell betrachtet. Da stdin jedoch nicht mit einem Terminal verbunden ist, setzt sich Bash nicht in den interaktiven Modus ( $-enthält keine i). .

(Persönlich scheint dieser Fall weitaus sinnvoller zu sein als die Umkehrung, ssh somehost somecommanddie nicht als "Anmeldeshell" betrachtet wird, obwohl es sich um eine neue Anmeldung handelt, somehostwie oben beschrieben.)

Ich habe kürzlich getan, was ich vor langer Zeit hätte tun sollen, und eine Tabelle mit den Modi von Bash und den ausgeführten Init-Dateien zusammengestellt . Wenn Sie es verwirrend finden, sollten Sie sich zumindest dessen bewusst sein, dass ich es auch tue. Es ist mir ein Rätsel, was ihr ursprüngliches Ziel mit den Regeln darüber war, wann sie .bashrcausgeführt werden.

Curt J. Sampson
quelle
1

Die meisten Login-Shells auf einem neu installierten System sind eigentlich nicht interaktiv:

$ 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

Klar /bin/bashund /bin/shsind traditionelle Muscheln und sie sind interaktiv. Alle anderen Elemente in dieser Liste sind jedoch nicht interaktiv. Wenn Sie die Liste lesen und nicht wissen, was einer von ihnen tut, können Sie einfach seine Handbuchseite nachschlagen (zum Beispiel mit man nologinoder man sync).

Was der Befehl tatsächlich tut

Wenn ich mir die Posting-Historie von Captain Man ansehe, sehe ich, dass sie ziemlich unerfahren mit Unix sind. Vielleicht bezog sich die Frage im Kommentar zu "Nicht folgen" auf die Befehlszeile oben in der Antwort, nicht nur auf die Ausgabe. Deshalb erkläre ich auch die Kommandozeile, auch wenn sie bei dieser Frage nicht zum Thema gehört.

Der Befehl ist eine Unix-Pipeline . Eine Pipeline ist eine Befehlskette - Sie lesen sie von links nach rechts -, in der die Ausgabe des ersten Befehls zur Eingabe des zweiten, die Ausgabe des zweiten zur Eingabe des dritten usw. wird Ende der Pipeline. Die Ausgabe des letzten Prozesses wird auf dem Terminal angezeigt (sofern sie nicht umgeleitet wurde). Weitere Informationen finden Sie im Wikipedia-Eintrag zu Shell-Pipelines .

Wenn Sie nicht verstehen, was eine Pipeline tut, können Sie sie einfach in Segmenten ausführen, um zu sehen, was passiert. Sie können auch die Handbuchseite für die verwendeten Befehle lesen (hier awk,, sortund uniq). Tatsächlich sollten Sie das jetzt tun. Ich werde warten.

Lassen Sie uns die Phasen der Pipeline schrittweise ausführen (dies können Sie problemlos auf Ihrem eigenen Unix-System tun):

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

Die Ausgabe oben ist einfach der Inhalt des siebten Feldes aus der /etc/passwdDatei. Das ist die (Flat-Text-Datei) -Datenbank, die dem System mitteilt, was die Login-Shell aller Benutzer ist. Wenn Sie mehr darüber erfahren möchten, /etc/passwdlesen Sie es einfach (es ist von der Welt lesbar) und schauen Sie auf die Handbuchseite (man 5 passwd).

Wenn Sie also die gesamte Liste dort lesen, können Sie eine Vorstellung davon bekommen, was die beliebtesten Elemente sind. Dies ist jedoch kein gutes Format für die Beantwortung dieser Frage, da es wirklich darum ging, wie häufig nicht interaktive Shells sind. Zählen wir sie auf. Der einfachste Weg, dies zu tun, besteht darin, die Elemente zuerst zu sortieren:

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

Mit dem Programm können uniqwir uns nur die Unikate anzeigen lassen:

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

Aber warte, das nützt nichts, wie viele von jedem waren da? Fragen wir uniq(lesen Sie die Manpage!):

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

Das ist natürlich die Ausgabe, die wir oben in der Antwort gesehen haben. Sortieren wir es noch einmal, um die Einträge in der Reihenfolge zu sehen:

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

Warten Sie, das kann nicht richtig sein, 17 kommt vor 1 und 5 nach 23. Das Problem ist, dass die Artikel lexikografisch sortiert werden . Lassen Sie uns sortsie numerisch und in umgekehrter Reihenfolge sortieren:

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

Ich denke, das erklärt alles in der ursprünglichen Antwort. Wenn Sie immer noch nicht genau wissen, was diese Befehle bewirken, können Sie die Handbuchseiten lesen. Wenn Sie sich noch nicht sicher sind, was in der Zukunft vor sich geht, lesen Sie am besten zunächst ein Buch (online oder auf Papier), in dem Unix und Linux erläutert werden.

James Youngman
quelle
Kannst du mir bitte etwas mehr erklären? Ich bin nicht sicher, ob ich dem folge, was ich lese.
Captain Man
ist /bin/synceine Muschel? Ist also irgendein Dienstprogramm eine Shell?
Eloone
@eloone Es gibt zwei (vielleicht drei) Bedeutungen für "Shell". Zum einen Programme, die als Anmeldeshell in der Kennwortdatenbank konfiguriert sind. Dies ist die Bedeutung des Wortes, das mit dem Ausdruck "nicht interaktive Anmeldeshell" gemeint ist. Die andere Bedeutung ist "eine REPL, die für die tägliche interaktive Arbeit auf einem Unix-System geeignet ist". Diese sind interaktiv. Die meisten im REPL-Kontext verwendbaren Programme unterstützen jedoch auch die nicht interaktive Verwendung als Interpreter für eine Art Skriptsprache (obwohl "Shell-Skript" fast allgemein "Bourne-Family-Shell-Skript" bedeutet).
James Youngman
2
Sie scheinen eine andere Frage zu beantworten. Sie listen nur die verfügbaren Shells auf und weisen darauf hin, dass einige niemals interaktiv sein werden. Ich glaube, das OP fragt, ob es jemals eine nicht interaktive Anmeldeshell in freier Wildbahn gibt. Also , ob Muscheln , die können interaktiv sein, bash zum Beispiel jemals startet nicht-interaktive Login Muscheln. Mit anderen Worten, eine "Login-Shell" bedeutet hier nicht "Standard-Login-Shell eines Benutzers", sondern eine Shell, die als Login-Shell gestartet wurde . Siehe unix.stackexchange.com/a/46856/22222
terdon
1
Oder bash --loginer fragt speziell nach bashProzessen, für die die iOption nicht festgelegt ist , da das Poster die Frage explizit schreibt . (Diese aus Befehlen auftreten, wie ssh somehost < script.sh, dies wird eine „Login, nicht-interaktive“ Shell im Sinne in dem angegebenen seine INVOCATION Abschnitt der Schlag - -Manpage.)
Curt J. Sampson