Come posso ottenere il nome utente dell'utente corrente in Bash?


321

Sto scrivendo un programma in Bash che deve ottenere il nome utente dell'utente.

Ho sentito parlare di una cosa chiamata whoami, ma non ho idea di cosa faccia o come usarla.

Quale comando devo usare per ottenere il nome utente corrente?


Sembra che nessuno dei metodi proposti finora funzioni senza fare affidamento su $ USER o invocare un processo separato. Non esiste un built-in bash per ottenere il nome utente senza invocare un processo separato?
ColinM,

9
Quando hai sentito un comando ma non sei sicuro di come usarlo, il controllo man whoamiè di solito una buona prima fermata per verificare la documentazione.
Mark Stosberg,

Risposte:


470

Sulla riga di comando, immettere

whoami

o

echo "$USER"

Per salvare questi valori in una variabile, fare

myvariable=$(whoami)

o

myvariable=$USER

Naturalmente, non è necessario creare una variabile poiché è a questo che serve la $USERvariabile.


53
Solo una breve nota che $ USER e whoami restituiscono valori diversi se si esegue un comando tramite ssh come un altro utente. whoami restituisce l'utente del sistema operativo e $ USER restituisce l'utente ssh.
BillMan,

4
@BillMan, cosa significa? Potresti fornire un esempio?
Dejay Clayton,

17
In alcuni casi, $USERnon è impostato affatto. Peggio ancora, è solo una variabile d'ambiente, quindi può essere sovrascritta dall'utente:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktif Cosa suggerisci come soluzione a questo problema?
SethMMorton,

3
@SethMMorton Mi rendo conto di aver fatto sembrare il problema peggiore del solito. Per rispondere alla domanda, tuttavia, l'utilizzo whoami(come suggerito) elimina del tutto il problema, supponendo che le variabili di ambiente sovrascritte siano un potenziale problema nel contesto.
sitaktif,

81

Un'alternativa whoamiè id -u -n.

id -urestituirà l'id utente (es. 0 per root ).


5
A meno che non mi sbagli, questa sarebbe la strada da percorrere se la portabilità è una preoccupazione in quanto il idcomando -ue le -nbandiere fanno parte di posix

3
Questa dovrebbe davvero essere la risposta accettata. "${USER}"ed whoamientrambi dipendono da come effettui l'accesso. In particolare, shell di accesso e sudo imposteranno $ USER e whoamiguarderanno l'utente collegato a stdin. Tuttavia, se stai eseguendo un processo batch da cron o se stai eseguendo uno script di avvio come utente diverso rispetto a root, questi genereranno l'utente errato (root) o nulla. Questa risposta restituirà il valore corretto indipendentemente dall'identificativo utente del processo.
Asfand Qazi,

Ciò non è utile se si desidera il nome utente anziché l'id
Jonathan,

3
se hai provato il comando prima di aggiungere commenti non veritieri, vedresti che l' -nargomento stampa il nome utente, proprio come la domanda originale posta. vedi quanto segue: id -u -nstampe brett- anche su darwin.
Brett,

20

Utilizzare il comando standard Unix / Linux / BSD / MacOS lognameper recuperare l'utente che ha effettuato l'accesso. Questo ignora l'ambiente così come sudo, poiché questi sono giornalisti inaffidabili. Stampa sempre il nome dell'utente che ha effettuato l'accesso e quindi esce. Questo comando esiste da circa il 1981.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

Un trucco che ho usato su Solaris 9 e Linux e che funziona benissimo per entrambi:

ps -o user= -p $$ | awk '{print $1}'

Questo frammento stampa il nome dell'utente con l'attuale EUID.

NOTA: qui hai bisogno di Bash come interprete.

Su Solaris hai problemi con i metodi, descritti sopra:

  • idnon accetta i parametri -ue -n(quindi dovrai analizzare l'output)
  • whoami non esiste (per impostazione predefinita)
  • who am I stampa il proprietario del terminale corrente (ignora EUID)
  • $USERla variabile è impostata correttamente solo dopo aver letto i file di profilo (ad esempio, /etc/profile)

1
Perché hai bisogno di bash come interprete? Nulla nella riga di comando mostrato sembra essere specifico di alcuna shell. In effetti, perché includere anche il pipe attraverso awk? Per quanto ne so, il tuo pscomando è tutto il necessario per visualizzare il proprietario del pid della shell corrente.
ghoti,

Per noi umani, ignorare l'informazione superflua è naturale. La parte awk isola i dati desiderati, per le variabili o in generale per il computer che non può ancora fare ipotesi al volo a questo livello rudimentale.
BradChesney79,

Su Solaris, usare command -p id(da una shell POSIX) o /usr/xpg4/bin/id. Più in generale, su Solaris, vorresti modificare il tuo ambiente per PATH=inserirti in un ambiente POSIX (con qualcosa come getconf PATH` ed essere sicuro di eseguire /usr/xpg4/bin/sh) per evitare di rimanere bloccato con i comandi degli anni '70 / '80.
Stephane Chazelas,

'ps: opzione sconosciuta - o'
Anand Rockzz,

12

Due comandi:

  1. id stampa l'id utente insieme ai gruppi. Formato:uid=usernumber(username) ...

  2. whoami dà il nome utente corrente


1
$ whoami non è disponibile come variabile in bash. Devi eseguire $ (whoami) o `whoami` per eseguire effettivamente il comando whoami!
Rudolf Mayer,

@RudolfMayer L'ho risolto
wjandrea il

6

Quando sono richieste autorizzazioni root (sudo), che di solito sono il 90% + quando si usano gli script, i metodi nelle risposte precedenti ti danno sempre rootcome risposta.

Ottenere l'attuale utente "connesso" è altrettanto semplice, ma richiede l'accesso a diverse variabili: $SUDO_UIDe $SUDO_USER.

Possono essere fatti eco:

echo $SUDO_UID
echo $SUDO_USER

O assegnato, ad esempio:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

Nel sistema operativo Solaris ho usato questo comando:

$ who am i     # Remember to use it with space.

Su Linux- Qualcuno ha già risposto a questo nei commenti.

$ whoami       # Without space

5

Per Bash , KornShell ( ksh), shecc. Molte delle vostre domande ricevono rapidamente risposta da:

man [function]

per ottenere la documentazione per il sistema in uso o di solito più conveniente:

google "funzione man"

Ciò può dare risultati diversi per alcune cose in cui Linux e Unix presentano differenze modeste.

Per questa domanda, inserisci "whoami" nella tua shell.

Per scriverlo:

myvar=$(whoami)

2

Il nome utente dell'utente corrente può essere ottenuto in puro Bash con l' ${parameter@operator}espansione dei parametri (introdotta in Bash 4.4):

$ : \\u
$ printf '%s\n' "${_@P}"

Il :built-in (sinonimo di true) viene utilizzato al posto di una variabile temporanea impostando l'ultimo argomento, in cui è memorizzato $_. Quindi lo espandiamo ( \u) come se fosse una stringa di prompt con l' Poperatore.

Questo è meglio dell'uso $USER, come $USERè solo una normale variabile ambientale; può essere modificato, non impostato, ecc. Anche se non viene manomesso intenzionalmente, un caso comune in cui è ancora errato è quando l'utente viene cambiato senza avviare una shell di accesso ( suimpostazione predefinita).


1

Sulla maggior parte dei sistemi Linux, semplicemente digitando whoami sulla riga di comando viene fornito l'ID utente.

Tuttavia, su Solaris, potrebbe essere necessario determinare l'ID utente, determinando l'UID dell'utente che ha effettuato l'accesso tramite il comando seguente.

echo $UID

Una volta noto l'UID, trova l'utente abbinando l'UID al /etc/passwdfile.

cat /etc/passwd | cut -d":" -f1,3

cat / etc / passwd | cut -d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Andrew Taylor

-4

Ottieni la user_struct dell'attività corrente

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
La domanda era su come ottenere il nome utente all'interno di uno script bash. Questa risposta riguarda come ottenere l'ID utente numerico (non il nome utente) dal codice C in esecuzione all'interno del kernel Linux (come da un modulo del kernel Linux personalizzato). Non è una risposta alla domanda che è stata posta, è una risposta a una domanda diversa.
Simon Kissane,
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.