No hay perfecto responder. Cuando cambia las ID de usuario, la ID de usuario original generalmente no se conserva, por lo que la información se pierde. Algunos programas, como logname
y who -m
implementar un truco donde verifican qué terminal está conectado a stdin
y luego verifique qué usuario ha iniciado sesión en ese terminal.
Esta solución a menudo funciona, pero no es infalible y ciertamente no debe considerarse seguro. Por ejemplo, imagina si who
genera lo siguiente:
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
usado su
para llegar a la raíz y ejecuta su programa. Si STDIN
no se redirige, entonces un programa como logname
generará tom
. Si ES redirigido (por ejemplo, desde un archivo) así:
logname < /some/file
Entonces el resultado es "no login name
", ya que la entrada no es la terminal. Más interesante aún, sin embargo, es el hecho de que el usuario podría hacerse pasar por un usuario conectado diferente. Dado que Joe está conectado en pts/1, Tom podría pretender ser él ejecutando
logname < /dev/pts1
Ahora dice joe
aunque tom es quien ejecutó el comando. En otras palabras, si usa este mecanismo en cualquier tipo de rol de seguridad, está loco.
Resultados:
Utilice who am i | awk '{print $1}'
O logname
ya que ningún otro método está garantizado.
Conectado como propio:
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$
Este es un ksh
función que escribí en HP-UX. No sé cómo funcionará con Bash
en linux La idea es que el sudo
El proceso se ejecuta como el usuario original y los procesos secundarios son el usuario de destino. Al retroceder a través de los procesos principales, podemos encontrar al usuario del proceso original.
#
# 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
}
Sé que la pregunta original era de hace mucho tiempo, pero la gente (como yo) sigue preguntando y este parecía un buen lugar para poner la solución.