Ermitteln der Standard-Shell eines Benutzers in einem Shell-Skript

10

Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Standard-Shell des aktuellen Benutzers in einem Shell-Skript herauszufinden.

Anwendungsfall: Ich arbeite an einem Skript, das einen Alias ​​für einen Befehl festlegt, und dieser Alias ​​wird in einem Shell-Skript festgelegt.

!# /bin/bash
alias = 'some command to set the alias'

Das Skript enthält eine Logik, die versucht, die Standard-Shell des Benutzers zu finden, der das Skript ausführt, und diesen Alias ​​in die entsprechende Datei ~ / .bashrc oder ~ / .zshrc einfügt

Da ich jedoch einen Shebang im vorderen Bereich des Skripts hinzufüge und ihn explizit auffordere, bash zu verwenden, geben die hier veröffentlichten Antworten immer wie erwartet bash zurück, obwohl ich dieses Skript auf einem ZSH-Terminal ausführe.

Gibt es eine Möglichkeit, den Shell-Typ zu ermitteln, in dem das Skript ausgeführt wird, unabhängig vom Shebang-Set?

Ich suche nach einer Lösung, die sowohl auf dem Mac als auch im gesamten Linux-basierten Bistro funktioniert.

Spanier89
quelle
@StephenRauch Ich hätte es früher erwähnen sollen, ich suche nach einer Methode, die sowohl auf Mac- als auch auf Linux-basierten Systemen funktioniert. / etc / passwd auf dem Mac enthält keine Benutzerinformationen und wird nur in einem einzelnen Benutzermodus abgerufen.
Spaniard89
Was hat /etc/passwdOSX? Ich habe einen kurzen Blick online geworfen und es scheint, dass die Shell da ist, nur nicht der Benutzername. Die Benutzer-ID ist immer noch da. Warum verwenden Sie das nicht?
Terdon
Ich würde mich fragen, ob es überhaupt möglich ist, eine vollständige Liste von Muscheln zu haben. Oder stimmen alle Shell-Startdateien immer mit {name_of_shell} rc überein?
Jamesqf

Antworten:

6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
Ipor Sircer
quelle
Danke, es funktioniert wie ein Zauber! Dies ist die einzige Lösung, die wahrscheinlich sowohl für Mac- als auch für Linux-basierte Bistros funktioniert.
Spaniard89
1
Übrigens habe ich den Befehl ein wenig bearbeitet, um ihn für alle Betriebssysteme finger $USER | grep 'Shell:*' | cut -f3 -d ":"unabhängig zu machen, da die grep-Optionen -P auf dem Mac nicht unterstützt werden.
Spaniard89
2
Beachten Sie, dass dies fingermöglicherweise nicht auf allen Computern installiert ist. Es ist ein optionales Paket auf RedHat-basierten Systemen.
Stephen Harris
1
@Kishorepandey: Sie können getent|grep ^$USER:|cut -f: -f7anstelle von Finger verwenden, wenn Finger nicht standardmäßig installiert war.
Ipor Sircer
@ Kishorepandey Tu das nicht. Verwenden Sie die SHELLUmgebungsvariable, falls vorhanden. Wenn Sie sich die Benutzerdatenbank ansehen, erhalten Sie ein Ergebnis (die Anmeldeshell des Benutzers), aber es ist möglicherweise nicht das richtige Ergebnis (die bevorzugte interaktive Shell des Benutzers) - dies hängt von der Konfiguration des Benutzers ab.
Gilles 'SO - hör auf böse zu sein'
18

Die Umgebungsvariable wird SHELLimmer auf die Standard-Anmeldeshell des aufrufenden Benutzers erweitert (erhält den Wert von /etc/passwd).

Für jeden anderen Benutzer, mit dem Sie etwas verarbeiten müssen /etc/passwd, ist hier ein einfacher awkAusschnitt:

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd

Ersetzen Sie foobardurch den tatsächlichen Benutzernamen.

Wenn Sie ldap(oder etwas Ähnliches) haben, verwenden Sie getent, um die Datenbank abzurufen, anstatt sie direkt zu analysieren /etc/passwd:

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'

oder am saubersten Ansatz, lassen getentSie die Analyse durchführen (dank @Kusalananda):

getent passwd foobar | awk -F: '{print $NF}'
heemayl
quelle
3
getent passwd foobarum zu überspringen, dass eine bestimmte Zeile übereinstimmen muss.
Kusalananda
Danke für die Antwort. Ich hätte es früher erwähnen sollen, ich suche nach einer Methode, die sowohl auf Mac- als auch auf Linux-basierten Systemen funktioniert. / etc / passwd auf dem Mac enthält keine Benutzerinformationen und wird nur in einem einzelnen Benutzermodus abgerufen.
Spaniard89
4

Da dies unter getentMacOS kein Standardbefehl ist, möchten Sie möglicherweise einen getpwuidAnruf auf niedrigerer Ebene verwenden , der die Namensdienste konsultiert, für die der Computer konfiguriert ist. Dies erfordert möglicherweise das Aufrufen von perloder python, was auf den meisten Unix-ähnlichen Plattformen häufig vorkommt

Dies gibt beispielsweise die Shell für den aktuellen Benutzer zurück:

perl -e '@x=getpwuid($<); print $x[8]'
Stephen Harris
quelle
2

Sie können die Standard-Shell des Benutzers wie folgt aus der Umgebung abrufen:

echo $SHELL

Aber nicht so:

echo $0

Letzteres sagt Ihnen nur, welche Shell Ihr Skript gerade verwendet. Sie möchten also die erste Option oben.

Alxs
quelle
0

Kurz und schmerzlos:

getent passwd <USER> | cut -d : -f 7
David Foerster
quelle
0

Vielleicht das:

   grep $USER </etc/passwd | cut -f 7 -d ":"
user226946
quelle
Dies verbessert keine der bereits gegebenen Antworten.
Kusalananda
Dies funktioniert nicht, wenn mehrere Benutzer gemeinsame Werke haben. zB wenn USER=freddann dieses Spiel fred, frederick, alfred, alfredo...
Stephen Harris