Come ottenere HOME, dato UTENTE?


41

Ho una USERvariabile nella mia sceneggiatura e voglio vedere il suo HOMEpercorso in base alla USERvariabile. Come lo posso fare?

Risposte:


73

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

getent è la risposta migliore, specialmente con l'utente remoto. nei sistemi più semplici ~ l'utente dovrebbe essere sufficiente. Ti ho modificato.
Rui F Ribeiro,

@RuiFRibeiro che non puoi usare ~foocon le variabili in bash. Non direttamente, comunque.
muru,

1
@muru - è vero - ed è un comportamento specifico. la ~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.
Mikeserv,

1
Nota che questo ti dà solo il valore iniziale di $ HOME; gli script di accesso dell'utente hanno il diritto di cambiarlo in qualcos'altro. Questa è una cosa insolita da fare, ma posso pensare a situazioni in cui sarebbe sensato, ad esempio scegliere tra un homedir locale e uno montato su NFS.
zwol,

1
@HagenvonEitzen I due punti sono vietati proprio perché sono stati utilizzati per separare i campi.
Jenny D,

9

È 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.


1
Non c'è bisogno di eval lì. Stai attento con il tuo inglese.
Rui F Ribeiro,

4
@nwk an evalè necessario. Bash non viene elaborato ~foodopo l'espansione variabile.
muru,

1
Interessante, grazie, tuttavia questo ottiene solo la directory dell'utente corrente , non di altri utenti. Penso che gli utenti LDAP non vengano gestiti, anche se posso sbagliarmi.
Rui F Ribeiro,

3
@RuiFRibeiro Funzionerà perfettamente con LDAP, basta usare qualunque variabile contenga il nome utente dell'utente LDAP invece di USER.
muru,

3
Non utilizzare questo senza verificare che $USERsi espande ad appena una singola stringa di caratteri alfabetici.
Chepner,

4

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).


2
hai ~ user per quello, e la tua soluzione non contempla gli utenti in sistemi più complessi, come l'utente proveniente da LDAP dove devi usare getent.
Rui F Ribeiro,

2

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'"

1

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.


Questo non è sicuro, a seconda della configurazione del sistema. Esegue un processo (la shell che esegue l'eco) come quell'utente, quindi l'utente può (ad esempio) gestire la shell e fornire un output arbitrario. Funziona anche nella configurazione dell'utente, quindi è possibile che vengano eseguiti i file di configurazione della shell dell'utente (che potrebbe anche fornire output arbitrari). O l'ambiente carica tramite pam. Ecc. O semplicemente fai qualcosa di semplice come inviarlo a SIGSTOP per farlo durare per sempre, efficacemente DOS attaccando il tuo script.
derobert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.