Sudo: ¿hay un comando para verificar si tengo sudo y / o cuánto tiempo me queda?


27

(Publicado originalmente en Stack Overflow. Sugirieron que intente aquí en su lugar. Aquí está la publicación original: /programming/3858208/sudo-is-there-a-command-to-check-if-i-have -sudo-y-o-cuanto-queda-tiempo-restante )

Ver título Quiero un comando que me permita consultar sudo. Idealmente, devolvería el éxito si todavía tengo sudo y falso si sudo ha expirado. Obtener el tiempo restante también podría ser útil (aunque si me preocupara, podría hacer sudo -v para revalidar). Ah, y no debería tener que pedir una contraseña.

Lo más parecido que he encontrado es "sudo -n true", pero la opción -n solo está presente en mi máquina Centos 5 en el trabajo. -n falla si tiene que pedir una contraseña. ¿Hay alguna otra forma de obtener esta funcionalidad? Suponga que en realidad no tengo root en todas las máquinas con las que trabajo, por lo que no puedo instalar nuevas versiones de sudo a mi gusto.

Por lo que vale, estoy haciendo esto para que pueda obtener mi mensaje para indicar el estado de sudo. Me gusta saber qué terminales se pueden sudo activamente. También tengo un mensaje que cambia de color cuando soy root, pero no uso root muy a menudo, por lo que es de uso limitado.

Respuestas:


10

La -nopción está disponible en versiones más nuevas de sudo, pero como usted dijo, esa no es una opción. No hay una manera real de hacer lo que está buscando, salvo probar sudo y ver si vuelve con una solicitud de contraseña. Si su preocupación es que desea una indicación visual, ¿por qué no comenzar sudo / bin / bash para iniciar una sesión de root bash? Tenga en cuenta que esto es inseguro, pero también es algo inseguro si alguien se da cuenta de sus cambios rápidos en sudo.


1
¡+1 para las ramificaciones de seguridad de un indicador visual!
Pausado hasta nuevo aviso.

Esa parte no se me había ocurrido. Lo que espero que haga el indicador es recordarme que ejecute sudo -K, en lugar de olvidar que dejé sudo activo y dejé abiertos algunos terminales potencialmente peligrosos. No es que a menudo me olvide de bloquear mi pantalla, pero me gusta el seguro adicional.
valadil

Por el momento, me inclino por comprobar sudo -V, y si es lo suficientemente nuevo como para tener -n, marcando -n para obtener la notificación. Parece que no debería romper nada en ningún lado.
valadil

@valadil: Se me ocurre que un indicador sutil no introduciría demasiado riesgo de seguridad. Active el subrayado para el nombre de usuario en la solicitud, por ejemplo.
Pausado hasta nuevo aviso.

@ Dennis: Exactamente. No iba a cambiar mi mensaje a "OMG_YOU_HAVE_SUDO_NOW! _User @ host" o algo así. Probablemente solo cambiaría un poco el color. No espero que nadie sepa lo que eso significa a menos que se sienten y se intimen con mi .bashrc.
valadil

29

Sé que esta es una pregunta muy antigua, pero aquí lo hice en un script hoy:

CAN_I_RUN_SUDO = $ (sudo -n uptime 2> & 1 | grep "load" | wc -l)
si [$ {CAN_I_RUN_SUDO} -gt 0]
luego
    echo "Puedo ejecutar el comando sudo"
más
    echo "No puedo ejecutar el comando Sudo"
fi

1

El siguiente comando mostrará una indicación en color de que le has otorgado sudo, por lo que debes recordar hacer sudo -kantes de salir de la máquina. Es útil también en terminales no coloreados.

Como podemos tener sudo activo e inactivo en diferentes sesiones de terminal, creé esto que puedes poner al final de tu ~ / .bashrc

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn=`if(($?==0));then echo true; else echo false; fi`

    history -a; # append to history at each command issued!!!
    local width=`tput cols`;
    local half=$((width/2))
    local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

En el tipo de terminal bashpara probarlo. También agregará una línea completa cada vez que ejecute un comando, que tenga la información de la hora en que finalizó el último comando, para que pueda ir a almorzar y saber cuándo terminó el último comando :).

Puedes jugar con este código para satisfacer tus necesidades. También está la variable PS1 (esa es la línea simple de solicitud pequeña real), pero creo que es mejor no meterse con ella.

PD .: para OS-X, busque el comentario a continuación de @nwinkler.


Comprobación del código de salida sudo -nno parecen funcionar en OS X. Ver mi pregunta aquí: superuser.com/questions/902826/...
nwinkler

bueno, la prueba que propongo es sudo -n, ¿crees que podría haber alguna otra prueba que pudiera usarse para determinar si el usuario tiene acceso sudo activo? o tal vez OS-X requiere alguna actualización? Nunca usé OS-X por cierto.
Acuario Power

2
Estoy usando la última versión de OS X. Es posible que sudo -nen BSD (en el que se basa OS X) tenga un comportamiento diferente al de la versión GNU. Acabo de agregar mi comentario para que la gente sepa que esta versión de la verificación no parece funcionar en OS X. He utilizado una verificación de otra respuesta ( sudo -n uptime 2>&1|grep "load"|wc -l), y parece funcionar bien en OS X. No es tan elegante, pero funciona.
nwinkler

1
@nwinkler oh, por lo que en realidad depende de la salida que genera (no del valor de retorno), solución interesante
Aquarius Power

@nwinkler pero está lo más cerca posible. O incluso mejor porque se sudo -nvuelve defectuoso en sudo -V 1.7.9
Marco M. von Hagen

1

Para simplificar la respuesta dada por @ wags007

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

Sin embargo, si en su https://www.sudo.ws/man/1.8.15/sudoers.man.html configuración que tiene, defaults mail_badpassse enviará un correo para cada prueba que resulte en falso (lo habría solicitado). Para evitar tales molestias, cambie esa parte de su archivo de sudoers a

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

Como resultado, se envían correos de alerta de seguridad para todos los comandos excepto / bin / true. Bueno, sí, alguien podría intentar forzar una contraseña por fuerza bruta llamando sudo trueun número ilimitado de veces sin enviar ningún correo de alerta de seguridad.

Nota: Utilice siempre en visudolugar de su editor favorito para editar el archivo sudoers. De lo contrario, corre el riesgo de quedar bloqueado.


0

De acuerdo con el manual de sudo, la sesión de sudo se determina de acuerdo con el archivo de marca de tiempo ( /usr/lib/sudo/<username>), por lo que puede averiguar cuánto tiempo queda al verificar la fecha / hora del archivo de marca de tiempo. Sin embargo, en mi sistema, el archivo de marca de tiempo es de hecho un directorio, y hay tres archivos con contenido críptico (y también algunas /usr/lib/sudo/<username>marcas de tiempo extrañas, pero parecía tener una marca de tiempo que coincidía con el momento en que le di a sudo mi contraseña) Creo que /usr/lib/sudo/<username>/0tiene la marca de tiempo de la sudoejecución más reciente .


1
En mi sistema, los archivos de marca de tiempo están en un directorio que no se puede leer sin usar sudo, que solicita una contraseña y, por lo tanto, no funcionaría para las necesidades del OP.
Pausado hasta nuevo aviso.

Buen punto. No verifiqué la propiedad de estos archivos. Tienes razón, sería inútil.
Dysaster


0

Al menos en sudo 1.8.21p2, este enfoque funciona bien:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi

0

Esta es probablemente una exageración extrema para el estándar de la mayoría de las personas, pero aquí está la función (posiblemente correcta) que uso para verificar si sudoestá desbloqueada (la función no perderá su tiempo si el usuario la está ejecutando root, ya que no hay necesidad de desbloquearla sudo):

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo

-1

respuesta simple ...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0

Esto solicitará una contraseña, si el usuario aún no tiene una sesión de sudo activa
Slizzered

-2

¿Qué tal la página man

man sudo

Enumere sus comandos disponibles:

sudo -l

sudo en sí no tiene límites de tiempo o fecha ... ver:

man sudo
man sudoers

sudo -l me da una solicitud de contraseña. Lo necesito para decirme que no tengo una sesión de sudo activa.
valadil

el estado de sudo se agota, pero está en lo correcto si quiere decir que no tiene una función de programación.
Pausado hasta nuevo aviso.

Sí, se agota el tiempo, pero no hay horario.
Andreas Rehm
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.