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?
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?
Respuestas:
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 sudo
privilegio.
$ 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.
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 sudo
ejecutado con éxito otros comandos, pero ese unable to resolve host
mensaje me ha preocupado de que algo más pueda ser extraño en el host.
sudoers
archivo. Allí puede especificar en qué host está autorizado un usuario para ejecutar un comando específico (esto es útil cuando se utiliza el mismo sudoers
archivo en varias máquinas). Posiblemente el nombre de host especificado en ese archivo no se pudo resolver. Intenta comprobarlo con el host
comando, por ejemplo.
sudo -v
dado que "xx no está en el archivo sudoers. Este incidente será reportado".
Esto es muy simple. Ejecutar sudo -l
. Esto enumerará todos los privilegios de sudo que tenga.
sudo -l
pide una contraseña si puedes sudo o no. sudo -v
solo pregunta si puedes, y "$(whoami)" != "root"
nunca preguntarás nada en ningún linux.
sudo
privilegios.
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 sudo
acceso.
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
.
timeout
no está disponible de forma predeterminada, por ejemplo, en OS X?
coreutils
, por ejemplo brew install coreutils
.
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
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 0
si el usuario actual puede llamar a 'sudo' y 1
si no.
Explicación:
El parámetro adicional -n
para sudo
evitar la interactividad.
El resultado $A
del 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).
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)
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.
Siga estos pasos para ver el archivo sudoers. Si estás allí, tienes sudo. Si no, puede agregarse usted mismo.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
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
?