Ho una USER
variabile nella mia sceneggiatura e voglio vedere il suo HOME
percorso in base alla USER
variabile. Come lo posso fare?
Ho una USER
variabile nella mia sceneggiatura e voglio vedere il suo HOME
percorso in base alla USER
variabile. Come lo posso fare?
Risposte:
Esiste un'utilità che cercherà le informazioni dell'utente indipendentemente dal fatto che tali informazioni siano archiviate in file locali come /etc/passwd
o in LDAP o in qualche altro metodo. Si chiama getent
.
Al fine di ottenere informazioni sugli utenti da esso, si esegue getent passwd $USER
. Otterrai una riga che assomiglia a:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Ora puoi semplicemente tagliare la home directory da essa, ad esempio usando cut, in questo modo:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
con le variabili in bash
. Non direttamente, comunque.
~
fa sembra scheda-espandersi, anche se, e un altro comportamento spec del prefisso tilde è sostituito da un percorso della directory di lavoro iniziale associato con il nome di login ottenuto utilizzando la getpwnam()
funzione di e quindi probabilmente che ricerca è piuttosto buona. non mi piacciono le espansioni di schede, però - mi piace digitare le schede.
È possibile utilizzare eval
per ottenere la home directory di qualcuno.
eval echo "~$USER"
Almeno per gli utenti locali questo funziona di sicuro. Non so se vengono gestiti utenti remoti come LDAP eval
.
eval
è necessario. Bash non viene elaborato ~foo
dopo l'espansione variabile.
USER
.
$USER
si espande ad appena una singola stringa di caratteri alfabetici.
Il solito posto è /home/$USER
, ma non deve essere universale. Il posto definitivo per cercare tali informazioni è all'interno del file /etc/passwd
.
Quel file è leggibile dal mondo (chiunque potrebbe leggerlo), quindi qualsiasi utente ha accesso al suo contenuto.
Se nel file esiste $ USER, la voce precedente all'ultima è la directory HOME dell'utente.
Questo selezionerà la voce e stamperà la directory HOME:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
Per i sistemi più complessi (remoti), getent è il solito comando per ottenere informazioni sugli utenti dal sistema NSS (librerie di switch di servizi di nome).
Un comando di
echo $(getent passwd $USER )| cut -d : -f 6
Fornirà informazioni equivalenti (se disponibili).
Se l'utente non esiste, getent
restituirà un errore.
Ecco una piccola funzione shell che non ignora il codice di uscita di getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
Ecco un esempio di utilizzo:
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'"
Se si è effettuato l'accesso come root, se si conosce USER
la password o se USER
non dispone di password, la seguente è un'altra opzione:
su -c 'echo ~' ${USER}
In base al su
comportamento standard , se USER
non definito o vuoto, allorasu
tenterà quindi di eseguire il comando come root.
Se il valore di USER
non è un nome utente valido, quindi un errore appropriato sarà sollevato: su: user <user> does not exist
.
Ci sono già molte buone risposte qui, ma questo può ancora aiutare qualcuno.