Non esiste un perfetto Rispondere. Quando si modificano gli ID utente, l'ID utente originale non viene in genere conservato, quindi le informazioni vengono perse. Alcuni programmi, come logname
e who -m
implementano un hack dove controllano quale terminale è connesso a stdin
, quindi controlla quale utente ha effettuato l'accesso su quel terminale.
Questa soluzione spesso funziona, ma non è infallibile e certamente non dovrebbe essere considerato sicuro. Ad esempio, immagina se who
emette quanto segue:
tom pts/0 2011-07-03 19:18 (1.2.3.4)
joe pts/1 2011-07-03 19:10 (5.6.7.8)
tom
usato su
per accedere a root ed esegue il programma. Se STDIN
non viene reindirizzato, allora un programma come logname
produrrà tom
. Se viene reindirizzato (ad esempio da un file) in questo modo:
logname < /some/file
Quindi il risultato è "no login name
", poiché l'input non è il terminale. Ancora più interessante, tuttavia, è il fatto che l'utente potrebbe fingere di essere un altro utente che ha effettuato l'accesso. Poiché Joe ha effettuato l'accesso su pts/1, Tom potrebbe fingere di essere lui eseguendo
logname < /dev/pts1
Ora dice joe
anche se Tom è quello che ha eseguito il comando. In altre parole, se usi questo meccanismo in qualsiasi tipo di ruolo di sicurezza, sei pazzo.
Risultati:
Usa who am i | awk '{print $1}'
OPPURE logname
poiché nessun altro metodo è garantito.
Accesso effettuato come self:
evan> echo $USER
evan
evan> echo $SUDO_USER
evan> echo $LOGNAME
evan
evan> whoami
evan
evan> who am i | awk '{print $1}'
evan
evan> logname
evan
evan>
sudo normale:
evan> sudo -s
root> echo $USER
root
root> echo $SUDO_USER
evan
root> echo $LOGNAME
root
root> whoami
root
root> who am i | awk '{print $1}'
evan
root> logname
evan
root>
sudo su - :
evan> sudo su -
[root ]# echo $USER
root
[root ]# echo $SUDO_USER
[root ]# echo $LOGNAME
root
[root ]# whoami
root
[root ]# who am i | awk '{print $1}'
evan
[root ]# logname
evan
[root ]#
sudo su -; su tomo :
evan> sudo su -
[root ]# su tom
tom$ echo $USER
tom
tom$ echo $SUDO_USER
tom$ echo $LOGNAME
tom
tom$ whoami
tom
tom$ who am i | awk '{print $1}'
evan
tom$ logname
evan
tom$
Questo è un ksh
funzione che ho scritto su HP-UX. Non so come funzionerà con Bash
su Linux. L'idea è che il file sudo
il processo è in esecuzione come utente originale e i processi figlio sono l'utente di destinazione. Tornando indietro attraverso i processi padre, possiamo trovare l'utente del processo originale.
#
# The options of ps require UNIX_STD=2003. I am setting it
# in a subshell to avoid having it pollute the parent's namespace.
#
function findUser
{
thisPID=$$
origUser=$(whoami)
thisUser=$origUser
while [ "$thisUser" = "$origUser" ]
do
( export UNIX_STD=2003; ps -p$thisPID -ouser,ppid,pid,comm ) | grep $thisPID | read thisUser myPPid myPid myComm
thisPID=$myPPid
done
if [ "$thisUser" = "root" ]
then
thisUser=$origUser
fi
if [ "$#" -gt "0" ]
then
echo $origUser--$thisUser--$myComm
else
echo $thisUser
fi
return 0
}
So che la domanda originale risale a molto tempo fa, ma le persone (come me) lo stanno ancora chiedendo e questo sembrava un buon posto per mettere la soluzione.