Ho una USERvariabile nella mia sceneggiatura e voglio vedere il suo HOMEpercorso in base alla USERvariabile. Come lo posso fare?
Ho una USERvariabile nella mia sceneggiatura e voglio vedere il suo HOMEpercorso in base alla USERvariabile. 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
~foocon 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 evalper 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 ~foodopo l'espansione variabile.
USER.
$USERsi 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, getentrestituirà 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 USERla password o se USERnon dispone di password, la seguente è un'altra opzione:
su -c 'echo ~' ${USER}
In base al sucomportamento standard , se USERnon definito o vuoto, allorasu tenterà quindi di eseguire il comando come root.
Se il valore di USERnon è 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.