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.sh
ein Skript (und selbst das scheint so) ein bisschen seltsam). Ist das richtig oder sind sie häufiger?
14
telnet towel.blinkenlights.nl
für eine Login-Shell, die nicht interaktiv ist ;-)Antworten:
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/nologin
nicht. )Sie haben Recht, dass
/bin/bash --login some-script.sh
ein 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
. Hiersshd
wird Bash mitargv[0]
set to gestartet ,-bash
da 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 keinei
). .(Persönlich scheint dieser Fall weitaus sinnvoller zu sein als die Umkehrung,
ssh somehost somecommand
die nicht als "Anmeldeshell" betrachtet wird, obwohl es sich um eine neue Anmeldung handelt,somehost
wie 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
.bashrc
ausgeführt werden.quelle
Die meisten Login-Shells auf einem neu installierten System sind eigentlich nicht interaktiv:
Klar
/bin/bash
und/bin/sh
sind 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 mitman nologin
oderman 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
,,sort
unduniq
). 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):
Die Ausgabe oben ist einfach der Inhalt des siebten Feldes aus der
/etc/passwd
Datei. 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/passwd
lesen 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:
Mit dem Programm können
uniq
wir 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!):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:
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
sort
sie numerisch und in umgekehrter Reihenfolge sortieren: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.
quelle
/bin/sync
eine Muschel? Ist also irgendein Dienstprogramm eine Shell?bash --login
er fragt speziell nachbash
Prozessen, für die diei
Option nicht festgelegt ist , da das Poster die Frage explizit schreibt . (Diese aus Befehlen auftreten, wiessh somehost < script.sh
, dies wird eine „Login, nicht-interaktive“ Shell im Sinne in dem angegebenen seine INVOCATION Abschnitt der Schlag - -Manpage.)