Il n'y a pas de parfait réponse. Lorsque vous modifiez les ID utilisateur, l'ID utilisateur d'origine n'est généralement pas conservé, de sorte que les informations sont perdues. Certains programmes, tels que logname
et who -m
mettre en œuvre un hack où ils vérifient pour voir quel terminal est connecté à stdin
, puis vérifiez quel utilisateur est connecté sur ce terminal.
Cette solution souvent fonctionne, mais n'est pas infaillible et ne doit certainement pas être considéré comme sûr. Par exemple, imaginez si who
affiche ce qui suit :
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
utilisé su
pour accéder à la racine et exécute votre programme. Si STDIN
n'est pas redirigé, alors un programme comme logname
affichera tom
. S'il EST redirigé (par exemple depuis un fichier) comme suit :
logname < /some/file
Alors le résultat est "no login name
", puisque l'entrée n'est pas le terminal. Plus intéressant encore, cependant, est le fait que l'utilisateur pourrait se faire passer pour un autre utilisateur connecté. Puisque Joe est connecté sur pts/1, Tom pourrait faire semblant d'être lui en exécutant
logname < /dev/pts1
Maintenant, il dit joe
même si tom est celui qui a exécuté la commande. En d'autres termes, si vous utilisez ce mécanisme dans n'importe quel type de rôle de sécurité, vous êtes fou.
Résultats :
Utilisez who am i | awk '{print $1}'
OU logname
car aucune autre méthode n'est garantie.
Connecté en tant que soi :
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 normal :
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 tom :
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$
Ceci est un ksh
fonction que j'ai écrit sur HP-UX. Je ne sais pas comment cela fonctionnera avec Bash
sous Linux. L'idée est que le sudo
Le processus s'exécute en tant qu'utilisateur d'origine et les processus enfants sont l'utilisateur cible. En revenant sur les processus parents, nous pouvons trouver l'utilisateur du processus d'origine.
#
# 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
}
Je sais que la question initiale date d'il y a longtemps, mais les gens (comme moi) la posent encore et cela semblait être un bon endroit pour mettre la solution.