¿Cómo verificar si tengo acceso a sudo?

104

Recientemente me metí en problemas debido a esto.

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.

¿Hay alguna manera de verificar si tengo acceso a sudo o no?

Bruce
fuente
Pregúntele a su administrador de sistemas?
mdpc
1
@mdpc: ¿Hay otra forma además de eso?
Bruce
No ha mencionado si puede obtener acceso de root o no.
mdpc
46
Esta debe ser la primera vez que se ve a alguien haciendo un seguimiento de "Se informará este incidente" .
slhck

Respuestas:

121

Ejecutar sudo -v. Por lo general, se usa para extender el tiempo de espera de la contraseña de sudo, pero se puede usar para determinar si tiene algún sudoprivilegio.

$ sudo -v
Sorry, user [username] may not run sudo on [hostname].

Extracto de la página de manual:

Si se le da la opción -v (validar), sudo actualizará la marca de tiempo del usuario, solicitando la contraseña del usuario si es necesario. Esto extiende el tiempo de espera de sudo por otros 5 minutos (o lo que sea que se establezca en sudoers) pero no ejecuta un comando.

Si su usuario solo puede ejecutar comandos específicos , este comando funcionará, lo que indica que puede ejecutar algo con diferentes privilegios. Si bien el mensaje se ve diferente al intentar ejecutar un comando que no se le permite en este caso (y no se envía ningún correo a la raíz ), aún es posible que tenga problemas si los administradores leen /var/log/secure.

$ sudo ls
[sudo] password for [username]: 
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].

Para averiguar qué puede ejecutar con diferentes privilegios, puede usar sudo -l. Tenga en cuenta que este comando requiere que ingrese su contraseña.

Daniel Beck
fuente
2
Gracias. sudo -v funciona para mí. La página del manual dice que también puedo ejecutar sudo -l, pero eso me pide una contraseña. ¿Porqué es eso?
Bruce
2
@Bruce, supongo que aquí, pero de lo contrario, alguien (o un programa que ejecute) podría averiguar qué programas puede ejecutar su usuario actual (posiblemente sin ingresar la contraseña) e intentar usar esa información maliciosamente.
Daniel Beck
¿Qué supones que significa cuando recupere esto patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>? Ingresé mi contraseña y no obtuve nada sobre personas no autorizadas. Sé que he sudoejecutado con éxito otros comandos, pero ese unable to resolve hostmensaje me ha preocupado de que algo más pueda ser extraño en el host.
Patrick M
@PatrickM Parece un problema con el sudoersarchivo. Allí puede especificar en qué host está autorizado un usuario para ejecutar un comando específico (esto es útil cuando se utiliza el mismo sudoersarchivo en varias máquinas). Posiblemente el nombre de host especificado en ese archivo no se pudo resolver. Intenta comprobarlo con el hostcomando, por ejemplo.
Ale
No funciona para mí en RHEL 6, sudo -vdado que "xx no está en el archivo sudoers. Este incidente será reportado".
79E09796
43

Esto es muy simple. Ejecutar sudo -l. Esto enumerará todos los privilegios de sudo que tenga.

Brad Dausses
fuente
1
Tal vez rechazado porque repite lo que dijo Daniel Beck hace casi dos años.
G-Man
1
O explica lo que sucede, es un comentario, en el mejor de los casos
Ramhound
2
@ Jonathan: si quisieras escribir en ubuntu rigt ahora, te sudo -lpide una contraseña si puedes sudo o no. sudo -vsolo pregunta si puedes, y "$(whoami)" != "root"nunca preguntarás nada en ningún linux.
bksunday
@bksunday Tienes razón. Probé ahora en un Debian Jessy limpio y confirme sus resultados. Mi comentario anterior (eliminado ahora) fue probablemente el resultado de probar en una máquina en la que tenía algunos sudoprivilegios.
Jonathan Ben-Avraham
@ G-Man, pero esta respuesta simple me ayudó más que probablemente la respuesta más precisa de Daniel, donde este comando es el final desafortunadamente ...
Betlista
11

Aquí está la versión amigable para el script:

timeout 2 sudo id && echo Access granted || echo Access denied

ya que no se atascará en la entrada de contraseña si no tiene sudoacceso.

También puede configurarlo en una variable como:

timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"

Nota: en macOS, necesita instalar coreutils, por ejemplo brew install coreutils.

kenorb
fuente
¿Alguna alternativa para dónde timeoutno está disponible de forma predeterminada, por ejemplo, en OS X?
Harry
1
Necesita instalar coreutils, por ejemplo brew install coreutils.
kenorb
2
Esto no funciona para mí en un guión. Por una razón inexplicable, el guión se cuelga hasta que lo mato.
beruic
7

La respuesta de Gerald Schade aquí , ¡todavía se puede mejorar!

Utilizar

prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
  # exit code of sudo-command is 0
  echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
  echo "has_sudo__needs_pass"
else
  echo "no_sudo"
fi

Aquí hay un ejemplo completo de uso en un script :

#!/usr/bin/env bash

is_root () {
    return $(id -u)
}

has_sudo() {
    local prompt

    prompt=$(sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
    echo "has_sudo__pass_set"
    elif echo $prompt | grep -q '^sudo:'; then
    echo "has_sudo__needs_pass"
    else
    echo "no_sudo"
    fi
}

elevate_cmd () {
    local cmd=$@

    HAS_SUDO=$(has_sudo)

    case "$HAS_SUDO" in
    has_sudo__pass_set)
        sudo $cmd
        ;;
    has_sudo__needs_pass)
        echo "Please supply sudo password for the following command: sudo $cmd"
        sudo $cmd
        ;;
    *)
        echo "Please supply root password for the following command: su -c \"$cmd\""
        su -c "$cmd"
        ;;
    esac
}

if is_root; then
    echo "Error: need to call this script as a normal user, not as root!"
    exit 1
fi


elevate_cmd which adduser
ajneu
fuente
2

Para mí, ' sudo -v' y ' sudo -l' no funcionaban en un script porque a veces era interactivo (pidiéndome una contraseña, como se mencionó anteriormente). ' sudo -n -l' tampoco funcionó, le dio el código de salida '1' aunque tengo permisos de sudo, debido a la falta de contraseña. Pero extendiendo el comando a:

A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor

fue exitoso para mí para el guión. Esta expresión da 0si el usuario actual puede llamar a 'sudo' y 1si no.

Explicación:
El parámetro adicional -npara sudoevitar la interactividad.
El resultado $Adel comando ' sudo -n -v 2>&1' puede ser:
- vacío (en este caso, el usuario actual puede llamar a sudo), o:
- una nota de que el usuario actual no está autorizado para sudo, o:
- un texto de pregunta para el contraseña (en este caso, el usuario está autorizado).
("asswor" se ajustará a una "contraseña" en inglés, así como a una "Passwort" en alemán).

Gerald Schade
fuente
2

Tengo un rango bajo para votar y comentar, pero quería votar a favor la respuesta de Gerald Schade, ya que descubrí que era la única forma anterior, y pensé que nadie más lo sabe, hasta ahora: D

por cierto mi solución:

[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]

(desde finales de 2015 mwhahaaa)

usuario629901
fuente
1
Lea "¿Por qué necesito 50 reputación para comentar?" Para asegurarse de que comprende cómo puede comenzar a comentar.
Pimp Juice IT
1

El "acceso al sudo" viene en sabores. Dos tipos principales: Primero, usted o un grupo del que sea miembro, debe estar configurado para el acceso a sudo en el archivo / etc / sudoers.

En segundo lugar, necesita saber su contraseña, o debe haber hecho un comando sudo recientemente. Recientemente, el tiempo de espera no ha expirado. (Dato curioso: puede hacer que el tiempo de espera sea muy largo en el archivo de su sudoer).

A menudo quiero probar el segundo tipo de acceso en el prólogo de un script que necesitará sudo algunos pasos. Cuando esta verificación falla, puedo aconsejarle al usuario que necesita habilitar el segundo tipo de acceso antes de ejecutar el script.

bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled

El -S le dice a sudo que lea la contraseña de stdin. El -p establece una solicitud vacía. El -K borra la segunda vez de acceso.

Como envía stderr a / dev / null, también verificará si el usuario tiene el primer tipo de acceso a sudo.

Ben Hyde
fuente
-4

Siga estos pasos para ver el archivo sudoers. Si estás allí, tienes sudo. Si no, puede agregarse usted mismo.

  1. su
  2. visudo
  3. Al final del archivo, ingrese your_username_here ALL=(ALL) ALL
  4. Golpear ESCy escribir:wq
  5. Tipo exit
  6. Vuelva a ejecutar su comando que necesitaba sudo
  7. Ingrese su contraseña (no la contraseña de la raíz)
Kruug
fuente
11
El OP "se metió en problemas" por correr sudo, por lo que probablemente no sea el administrador del sistema, ni siquiera uno de los administradores de élite del sistema. Probablemente sea solo un usuario que pensó que se le podrían haber otorgado algunos poderes limitados. ¿Qué te hace sospechar que él puede ir su?
Scott