El otro día estaba haciendo algunas tareas de mantenimiento en mi servidor web. Tenía prisa y sueño, así que hice todo usando el sudo
comando.
Y luego, accidentalmente presioné Ctrl+ V, enviando este comando a mi servidor web:
sudo rm -rf /*
Para aquellos que se preguntan qué hace el comando anterior: Esto eliminó todo mi servidor web
Afortunadamente, tuve copias de seguridad y, lamentablemente, tuve que pasar dos horas más despierto para solucionar este error increíble. Pero desde entonces, me he estado preguntando:
¿Hay alguna manera de aplicar siempre la contraseña de sudo para un comando específico?
Si el servidor me pidiera una contraseña, me salvaría de muchos problemas. No lo hizo, porque ejecuté unos 5 sudo
comandos antes de este majestuoso error.
Entonces, ¿hay alguna manera de hacerlo? Solo necesito la contraseña con el rm
comando para que siempre se aplique. Otros comandos que estoy usando son usualmente nano
o cp
ambos son (hasta cierto punto) revertables.
fuente
/*
se expande antes de pasar al comando rm. Entonces, el comando no ve un solo argumento, sino una lista de argumentos (/bin /boot /cdrom /dev /etc /home
...)rm
comando tenga una contraseña. Solo quierensudo
solicitar uno cada vez que se usa el comando rm. La solución a la pregunta que vinculaste sería un poco molesta cuando tu primer comando seasudo rm
. Como le pedirá dos contraseñas, una porsudo
unarm
.Respuestas:
Puede establecer el
timestamp_timeout
que0
los comandos particulares en/etc/sudoers
. Cree un archivovisudo -f /etc/sudoers.d/pduck
con el siguiente contenido:Ahora al usuario
pduck
siempre se le pide una contraseña cuando se ejecutasudo rm
(sin importar qué parámetros adicionales se le den) aunque el usuario sea miembro delsudo
grupo ysudo
recuerde su contraseña para otros comandos.La desventaja es que no puede agregar fácilmente parámetros a la
/bin/rm
línea en el archivo para restringir aún más esto. Bueno ... puedes, como:pero luego solo se le solicita exactamente
sudo rm -f
y no (nuevamente)sudo rm -rf
, por ejemplo.fuente
Un método sería usar safe-rm . Esto SOLO abordará el uso de "rm" y evitará que se ejecuten versiones específicas de "rm". Eso incluye eliminar su sistema raíz, pero también puede usarse para evitar la eliminación de directorios relacionados con el sistema como "/ usr /" o "/ var /". Desde el enlace:
fuente
sudo
proporciona una opción-k, --reset-timestamp
, verman sudo
:Podría escribir un contenedor simple para
sudo
probarrm -rf /*
y ejecutaren cambio, por ejemplo, así:
Ejemplo de uso
Prueba con
echo a
aquí.Si desea que se le pregunte cada vez que ejecuta
rm
en general, puede adaptar la función anterior de la siguiente manera:Si desea combinar tanto las llamadas de comando generales como las líneas de comando específicas, le recomiendo usar
case
, por ejemplo:Tenga en cuenta que estos enfoques no funcionarán si ejecuta
sudo
opciones: las posibles soluciones son[[ "$*" =~ " rm " ]]
verificar la cadena "rm" rodeada de espacios o*" rm "*)
concase
cualquier línea de comando que contenga "rm".fuente
[[ "$1" == "rm" ]] && opt="-k";
y ¿qué tal/bin/rm
?case
enfoque.Esta respuesta no aborda la
sudo
parte de su pregunta pero, por otro lado, aborda una forma de mitigar el peligro derm
invocaciones accidentales para cualquier usuario.Puedes alias
rm
arm -I
cual-f
que omita lo que anula las-I
opciones anteriores .--one-file-system
es otra posible protección contra la eliminación involuntaria que uso en mirm
alias.Preparar
Para crear dicho alias, use el comando:
Puedes ponerlo en tu
~/.bashrc
o incluso/etc/bash.bashrc
.Uso
Para confirmar el tipo
yes
o su traducción a su localidad o la primera letra de cualquier palabra y presione Enter. Cualquier otra entrada, incluida ninguna, anula la operación.fuente