Cuando ejecuto un script mediante sudo o su, quiero obtener el usuario original. Esto debería suceder independientemente de múltiples sudo
o su
que se ejecutan uno dentro del otro y específicamente sudo su -
.¿Cómo se encuentra el usuario original a través de múltiples comandos sudo y su?
Respuesta
Resultados:
Use who am i | awk '{print $1}'
O logname
como están garantizados no hay otros métodos.
Conectado como auto:
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$
¿Qué le parece usar el nombre de usuario (1) para obtener el nombre de usuario?
No hay perfecto respuesta. Cuando cambia las ID de usuario, la ID de usuario original no suele conservarse, por lo que la información se pierde. Algunos programas, como logname
y who -m
implementan un truco donde verifican qué terminal está conectado a stdin
y luego verifican qué usuario está conectado en ese terminal.
Esta solución a menudo funciona, pero no es infalible, y ciertamente no debe considerarse segura. Por ejemplo, imaginemos si who
da el siguiente resultado:
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
utiliza su
para llegar a la raíz, y se ejecuta el programa. Si STDIN
no se redirige, entonces un programa como logname
dará salida a tom
. Si es redirigido (por ejemplo de un archivo) como así:
logname < /some/file
entonces el resultado es "no login name
", ya que la entrada no es el terminal. Más interesante aún, sin embargo, es el hecho de que el usuario podría posar como un usuario diferente conectado. Desde que Joe se registra en el pts/1, Tom podría hacerse pasar por él mediante la ejecución de
logname < /dev/pts1
Ahora, dice joe
a pesar de que Tom es el que ejecutó el comando. En otras palabras, si usa este mecanismo en cualquier tipo de función de seguridad, está loco.
Si está ejecutando el script usted mismo (como lo demuestran los comandos utilizados), la seguridad no es el problema. Si es así, tienes mucho más problema ya que también tienen acceso sudo. La persona podría simplemente copiar el guión y modificarlo de la manera que quiera. Esta es simplemente una forma de obtener el nombre de usuario para usar en un script. ¿O me estoy perdiendo algo de lo que dices? – evan
@evan: Tener acceso a sudo no implica la capacidad de sobrescribir archivos. – Flimzy
@Flimzy ¿En qué caso root no tiene la capacidad de sobrescribir un archivo? – evan
Esta es una función ksh
que escribí en HP-UX. No sé cómo funcionará con Bash
en Linux. La idea es que el proceso sudo
se esté ejecutando como el usuario original y los procesos hijo sean el usuario objetivo. Al retroceder en 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é la pregunta original era desde hace mucho tiempo, pero la gente (como yo) todavía están pidiendo y esto parecía un buen lugar para poner la solución.
La función findUser() del usuario1683793 está portada a bash
y extendida, por lo que también devuelve los nombres de usuario almacenados en las bibliotecas NSS.
#!/bin/bash
function findUser() {
thisPID=$$
origUser=$(whoami)
thisUser=$origUser
while [ "$thisUser" = "$origUser" ]
do
ARR=($(ps h -p$thisPID -ouser,ppid;))
thisUser="${ARR[0]}"
myPPid="${ARR[1]}"
thisPID=$myPPid
done
getent passwd "$thisUser" | cut -d: -f1
}
user=$(findUser)
echo "logged in: $user"
FYI: esta función (y aquella en la que se basa) no retrocederá a través de múltiples shells generados por sudo anidados entre sí. – asdfghjkl
bicicleta hacia atrás y dar una lista de usuarios
basado en la respuesta de user1683793
Por exlcuding procesos que no son TTY, me salto raíz como el iniciador de la sesión. No estoy seguro de si eso puede exlcude demasiado en algunos casos
#!/bin/ksh
function findUserList
{
typeset userList prevUser thisPID thisUser myPPid myPid myTTY myComm
thisPID=$$ # starting with this process-ID
while [ "$thisPID" != 1 ] # and cycling back to the origin
do
( ps -p$thisPID -ouser,ppid,pid,tty,comm) | grep $thisPID | read thisUser myPPid myPid myTTY myComm
thisPID=$myPPid
[[ $myComm =~ ^su ]] && continue # su is always run by root -> skip it
[[ $myTTY == '?' ]] && continue # skip what is running somewhere in the background (without a terminal)
if [[ $prevUser != $thisUser ]]; then # we only want the change of user
prevUser="$thisUser" # keep the user for comparing
userList="${userList:+$userList }$thisUser" # and add the new user to the list
fi
#print "$thisPID=$thisUser: $userList -> $thisUser -> $myComm " >&2
done
print "$userList"
return 0
}
logname
o who am i
no me dio la respuesta deseada, especialmente no en listas más largas de su user1
, su user2
, su user3
, ...
Sé que la pregunta original era de hace mucho tiempo, pero las personas (como yo) siguen preguntando y este parecía un buen lugar para poner la solución.
alternativa a llamar varias veces ps: hacer una llamada pstree
pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1
de salida (cuando se conectó como par): (evan)
argumentos pstree:
- -l: largas colas (no acortando)
- -u: muestra cuando el usuario cambia como (nombre de usuario)
- -s: $$ muestran los padres de este proceso
Obtener el primer cambio de usuario (que es inicio de sesión) con grep -o
y head
.
limitación: el comando no puede contener ningún apoyos ()
(no lo hace normalmente)
pstree -lu -s $$ | head -n1 | sed-e 's/[^ \ (] * (\ ([^)] * \)). */\ 1 /' –
- 1. Múltiples comandos a través de Jsch Shell
- 2. cómo ejecutar dos comandos en sudo?
- 3. Arrastrar y soltar objetos y devolverlos a su posición original
- 4. Cambiar a sudo usuario dentro de una secuencia de comandos python
- 5. de comandos de Java que no se encuentra en Linux
- 6. Ejecutando comandos múltiples en cmd a través de psexec
- 7. ¿cómo se puede llamar a múltiples archivos desde la línea de comandos en su aplicación?
- 8. Ejecutar comandos sudo en Haskell
- 9. Para ejecutar comandos sudo en una instancia de ec2
- 10. ¿Dónde y cómo se encuentra el software con el hardware?
- 11. Transmitiendo información de usuario a través de múltiples EJB
- 12. Cómo detectar el idioma de un usuario a través de su dirección IP
- 13. ¿Cómo dar acceso a un usuario Linux sudo?
- 14. Errores de instalación de RubyGems cuando se usa 'sudo' y no se usa sudo
- 15. ¿Cómo sudo el proceso actual?
- 16. Paramiko y sudo
- 17. ¿Cómo ejecuto un comando como el usuario original de un programa sudo'd?
- 18. Conversión de caracteres UTF8 escapados a su forma original
- 19. invocación de casquillo y sudo
- 20. cómo configurar el nombre de usuario y la contraseña del servicio de Windows a través de la línea de comandos
- 21. Capistrano con solo 'sudo su - user' permitido
- 22. Ejecutando comandos a través de scripts PHP/Perl como usuario privilegiado en Linux
- 23. ¿Cómo puedo obtener el usuario real uid si el programa se ejecuta con sudo?
- 24. Yii encuentra modelos a través de many_many relación
- 25. Cómo obtener sudo para solicitar la contraseña a través de la GUI
- 26. ¿Cómo puedo ejecutar una serie de comandos en una subshell bash como otro usuario que usa sudo?
- 27. Iterar a través de las propiedades de un objeto y modificar el objeto original
- 28. Galletas - establecer a través de múltiples dominios
- 29. ¿Cómo puedo ejecutar node.js Express en modo de producción a través de sudo?
- 30. Si incluyo jQuery a través de bookmarklet, ¿arruinará el javascript original en el sitio?
En ese caso, sólo se puede usar 'que | awk '{print $ 1}' ' – SiegeX
... si eres el único que ha iniciado sesión (y solo una vez). –
todo lo que necesitas son 2 argumentos: 'quién soy yo 'es lo mismo que' quién huele mal '. Además, solo funciona si 'STDIN' está asociado con un TTY. Entonces, si ejecutas 'echo 'hello' '| ¿quién soy? Simplemente no funcionará. – tylerl