Ich habe eine USER
Variable in meinem Skript, und ich möchte seinen HOME
Pfad basierend auf der USER
Variablen sehen. Wie kann ich das machen?
Ich habe eine USER
Variable in meinem Skript, und ich möchte seinen HOME
Pfad basierend auf der USER
Variablen sehen. Wie kann ich das machen?
Antworten:
Es gibt ein Dienstprogramm, mit dem Benutzerinformationen unabhängig davon gesucht werden, ob diese Informationen in lokalen Dateien wie /etc/passwd
oder in LDAP oder einer anderen Methode gespeichert sind . Es heißt getent
.
Um Benutzerinformationen daraus zu erhalten, führen Sie aus getent passwd $USER
. Sie erhalten eine Zeile zurück, die wie folgt aussieht:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Jetzt können Sie einfach das Ausgangsverzeichnis daraus ausschneiden, z. B. mit cut, wie folgt:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
mit Variablen in verwenden bash
. Jedenfalls nicht direkt.
~
scheint sich jedoch zu erweitern, und ein anderes angegebenes Verhalten des Tilde-Präfixes soll durch einen Pfadnamen des anfänglichen Arbeitsverzeichnisses ersetzt werden, das mit dem Anmeldenamen verknüpft ist, der mit der getpwnam()
Funktion erhalten wurde, und daher ist die Suche wahrscheinlich ziemlich gut. ich mag allerdings keine tab-erweiterungen - ich tippe gerne tabs.
Mit können Sie das Basisverzeichnis eval
einer Person abrufen.
eval echo "~$USER"
Zumindest für lokale Benutzer funktioniert dies auf jeden Fall. Ich weiß nicht, ob Remote-Benutzer wie LDAP damit umgehen eval
.
eval
wird benötigt. Bash wird ~foo
nach variabler Erweiterung nicht verarbeitet .
USER
.
$USER
dehnt sich auf nur eine einzige Kette von Buchstaben.
Der übliche Ort ist /home/$USER
, aber das muss nicht universell sein. Der endgültige Ort für die Suche nach solchen Informationen befindet sich in der Datei /etc/passwd
.
Diese Datei ist weltweit lesbar (jeder kann sie lesen), sodass jeder Benutzer Zugriff auf ihren Inhalt hat.
Wenn $ USER in der Datei vorhanden ist, ist der vorletzte Eintrag das Benutzerverzeichnis HOME.
Dadurch wird der Eintrag ausgewählt und das HOME-Verzeichnis gedruckt:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
Bei komplexeren (entfernten) Systemen ist getent der übliche Befehl, um Benutzerinformationen vom NSS-System (Name Service Switch Libraries) abzurufen.
Ein Befehl von
echo $(getent passwd $USER )| cut -d : -f 6
Liefert gleichwertige Informationen (falls verfügbar).
Wenn der Benutzer nicht existiert, getent
wird ein Fehler zurückgegeben.
Hier ist eine kleine Shell-Funktion, die den Exit-Code von nicht ignoriert getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
Hier ist ein Anwendungsbeispiel:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
Wenn Sie als root angemeldet sind, USER
das Kennwort kennen oder USER
kein Kennwort haben, ist Folgendes eine weitere Option:
su -c 'echo ~' ${USER}
su
Wenn das Standardverhalten USER
undefiniert oder leer ist, su
wird versucht, den Befehl als root auszuführen.
Wenn der Wert USER
kein gültiger Benutzername ist, dann wird ein entsprechender Fehler ausgelöst werden: su: user <user> does not exist
.
Hier gibt es bereits viele gute Antworten, aber dies kann trotzdem jemandem helfen.