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 sudocomando.
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 sudocomandos antes de este majestuoso error.
Entonces, ¿hay alguna manera de hacerlo? Solo necesito la contraseña con el rmcomando para que siempre se aplique. Otros comandos que estoy usando son usualmente nanoo cpambos 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...)rmcomando tenga una contraseña. Solo quierensudosolicitar 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 porsudounarm.Respuestas:
Puede establecer el
timestamp_timeoutque0los comandos particulares en/etc/sudoers. Cree un archivovisudo -f /etc/sudoers.d/pduckcon el siguiente contenido:Ahora al usuario
pducksiempre se le pide una contraseña cuando se ejecutasudo rm(sin importar qué parámetros adicionales se le den) aunque el usuario sea miembro delsudogrupo ysudorecuerde su contraseña para otros comandos.La desventaja es que no puede agregar fácilmente parámetros a la
/bin/rmlínea en el archivo para restringir aún más esto. Bueno ... puedes, como:pero luego solo se le solicita exactamente
sudo rm -fy 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
sudoproporciona una opción-k, --reset-timestamp, verman sudo:Podría escribir un contenedor simple para
sudoprobarrm -rf /*y ejecutaren cambio, por ejemplo, así:
Ejemplo de uso
Prueba con
echo aaquí.Si desea que se le pregunte cada vez que ejecuta
rmen 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
sudoopciones: las posibles soluciones son[[ "$*" =~ " rm " ]]verificar la cadena "rm" rodeada de espacios o*" rm "*)concasecualquier línea de comando que contenga "rm".fuente
[[ "$1" == "rm" ]] && opt="-k";y ¿qué tal/bin/rm?caseenfoque.Esta respuesta no aborda la
sudoparte de su pregunta pero, por otro lado, aborda una forma de mitigar el peligro derminvocaciones accidentales para cualquier usuario.Puedes alias
rmarm -Icual-fque omita lo que anula las-Iopciones anteriores .--one-file-systemes otra posible protección contra la eliminación involuntaria que uso en mirmalias.Preparar
Para crear dicho alias, use el comando:
Puedes ponerlo en tu
~/.bashrco incluso/etc/bash.bashrc.Uso
Para confirmar el tipo
yeso 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