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


(Originalmente publicado en Stack Overflow. Me sugirieron que intentara aquí. Aquí está la publicación original: https://stackoverflow.com/questions/3858208/sudo-is-there-a-command-to-check-if-i-have-sudo-and-or-how-much-time-is-left)

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. También podría ser útil obtener el tiempo restante (aunque si me preocupaba, 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 cierto", pero la opción -n solo está presente en mi máquina Centos 5 en funcionamiento. -n falla si tiene que pedir una contraseña. ¿Hay alguna otra forma de obtener esta funcionalidad? Supongo que realmente 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 mi mensaje indique su estado. Me gusta saber qué terminales son sudo-able de forma activa. También tengo un mensaje que cambia de color cuando estoy en la raíz, pero no uso root muy a menudo, por lo que es de uso limitado.


23


origen




Respuestas:


los -n la opción está disponible en las versiones más nuevas de sudo, pero como dijiste, esa no es una opción. No hay una forma real de hacer lo que estás buscando, solo intentar con sudo y ver si aparece con una solicitud de contraseña. Si su preocupación es que desea una indicación visual, ¿por qué no comenzar a hacer sudo / bin / bash para iniciar una sesión root bash? Tenga en cuenta que esto no es seguro, pero también es algo inseguro si alguien se da cuenta de los cambios rápidos en sudo.


10



+1 por las ramificaciones de seguridad de un indicador visual! - Dennis Williamson
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 sudo se activó 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 estoy inclinado a verificar sudo -V, y si es lo suficientemente nuevo como para tener -n, marcando -n para recibir la notificación. Parece que no debería romper nada en ninguna parte. - 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 el aviso, por ejemplo. - Dennis Williamson
@Dennis: Exactamente. No iba a cambiar mi mensaje en "OMG_YOU_HAVE_SUDO_NOW! _User @ host" o algo así. Probablemente solo cambie el color un poco. No espero que nadie sepa lo que eso significa a menos que se sienten y se relacionen con mi .bashrc. - valadil


Sé que esta es una pregunta muy antigua, pero aquí estoy en un guión de hoy:

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

26



¡Perfecto, muchas gracias! - SeriousM
Este fragmento de código es justo lo que estaba buscando. Gracias. - David Medinets
¡Perfecto! ¡Gracias! - Karl Wilbur


El siguiente comando mostrará una indicación coloreada de que tiene sudo concedido, por lo que recuerda hacer una sudo -k antes de alejarse de la máquina. Es útil también en terminales sin color.

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 bash para probarlo También agregará una línea completa cada vez que ejecutes un comando, que tiene la información de la hora en que terminó el último comando, para que puedas almorzar y saber cuándo terminó el último comando :).

Puede jugar con este código para satisfacer sus necesidades. También está la variable PS1 (esa es la única línea pronta pequeña real), pero creo que es mejor no meterse con ella.

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


1



Verificando el código de salida de sudo -n no parece funcionar en OS X. Consulte mi pregunta aquí: superuser.com/questions/902826/... - nwinkler
bueno, la prueba que propongo es sudo -n¿Cree que podría haber alguna otra prueba que pueda usarse para determinar si el usuario tiene sudo access active? o tal vez OS-X requiere alguna actualización? Nunca usé OS-X por cierto. - Aquarius Power
Estoy usando la última versión de OS X. Es posible que sudo -n en BSD (en el que se basa OS X) tiene un comportamiento diferente al de la versión de GNU. Acabo de agregar mi comentario para que la gente sepa que esta versión del cheque no parece funcionar en OS X. He usado un cheque de otra respuesta (sudo -n uptime 2>&1|grep "load"|wc -l), y esto parece funcionar bien en OS X. No es tan elegante, pero funciona. - nwinkler
@nwinkler oh, entonces realmente depende de la salida que genera (no el valor de retorno), solución interesante - Aquarius Power
@nwinkler pero está lo más cerca posible. O incluso mejor porque sudo -n se vuelve con errores en sudo -V 1.7.9 - Marco M. von Hagen


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 revisando 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 en ellos (y también algunas marcas de tiempo extrañas, pero /usr/lib/sudo/<username>parecía tener una marca de tiempo que coincidía con el momento en que le di mi contraseña a sudo. creo /usr/lib/sudo/<username>/0 tiene la marca de tiempo de la más reciente sudo ejecución.


0



En mi sistema, los archivos de marca de tiempo están en un directorio que no se puede leer sin usar sudo, lo que solicita una contraseña y, por lo tanto, no funcionaría para las necesidades del OP. - Dennis Williamson
Buen punto. No revisé la propiedad de estos archivos. Tienes razón, sería inútil. - Dysaster


Advertencia

De acuerdo con Bugzilla sudo Bug ID = 590, la llamada a sudo -n true 2&>/dev/null ; echo $? se convertirá en un buggy sudo -V 1.7.10

Lea Bugzilla [aquí] (http://bugzilla.sudo.ws/show_bug.cgi?id=590"ID del error = 590")


0





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 tienes defaults mail_badpass se enviará un correo por cada prueba que resulte en falso (se 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, los correos de alerta de seguridad se envían para todos los comandos excepto / bin / true. Bueno, sí, alguien podría tratar de usar la fuerza bruta de una contraseña llamando sudo true un número ilimitado de veces sin enviar ningún correo de alerta de seguridad.

Nota: siempre use visudo en lugar de tu editor favorito para editar el archivo sudoers. Si no lo haces, corre el riesgo de ser bloqueado.


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





Esto es probablemente demasiado exagerado para el estándar de la mayoría de la gente, pero aquí está la función (posixly correcta) que uso para verificar si sudo está desbloqueado (la función no perderá su tiempo si el usuario que la ejecuta es root, ya que no hay necesidad de desbloquear 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

0





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

-1



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