Você pode usar este código para o script% wrapper rm
, mas também pode criar versões semelhantes para mv
e find
.
Editar 5 de março de 2017 - Alterar o método de verificação ao executar no terminal.
Essa resposta verifica se está sendo executada no terminal e não solicita senha se estiver executando em um script de segundo plano, como inicialização, cron ou GUI. O script pode ser melhorado para garantir que rm
foi digitado diretamente no terminal. Então, se outro script como sudo update-grub
ou sudo apt update
chamado rm
uma segunda senha não for necessário.
Eu escrevi um script para proteger com senha rm
, como o OP solicitado, e o código abaixo é o mesmo, exceto que exige senha do usuário sudo / root. Também tem edições para evitar que você exclua acidentalmente:
Crie o script
Use gksu gedit /usr/local/bin/rm
e copie nas seguintes linhas:
#!/bin/bash
tty -s;
if [ "0" == "$?" ]; then Terminal="Y"; else Terminal="N"; fi
if [ $Terminal == "Y" ] ; then
# Running from terminal don't allow delete of / or /toplevel directory even if sudo
for i in ${@:1}
do
# Skip options -i -r -v -d
if [[ ${i:0:1} != "-" ]] ; then
# if parameter doesn't begin with '-' it's file or directory, so get real path.
fullname=$(realpath "$i" 2>&1) # No error messages if file doens't exist
# We must have at least two '/' in the full path
levels=$(echo "$fullname" | tr -cd '/' | wc -c)
if (( $levels == 1 )); then # Test for 1, will be zero when file doesn't exist.
echo "Attempting to remove top level directory '$fullname'"
echo "Use 'sudo /bin/rm $@' instead."
exit 1 # error
fi
fi
done
fi
if [ $Terminal == "Y" ] ; then
# Only running from a terminal needs password (ie not cron)
# log rm usage to /var/log/syslog
PARENT_COMMAND="$(ps -o comm= $PPID)"
logger "$PARENT_COMMAND"" - rm command was used on file: ""$fullname"
# Get password
Password=$(zenity --password --title="Password for rm")
encryptPassword=$(echo -n "$Password" | md5sum)
echo "md5sum: $encryptPassword" # Comment out after viewing one time and updating line below.
if [[ "$encryptPassword" != "d2c30dc65e59558c852ea30b7338abbe -" ]]; then
echo "Invalid password!"
exit 1
fi
fi # non-terminals can't enter password.
# Call REAL rm command with parameters passed to this wrapper sript
/bin/rm "$@"
exit 0
Altere a senha "WE2U" para o que quiser e salve o arquivo.
Marcar o novo script rm
como executável
Marcar o novo script rm
como executável usando:
sudo chmod +x /usr/local/bin/rm
Como funciona
A menos que a senha seja WE2U , a primeira vez que você executar o script, receberá "senha inválida" e a chave de criptografia da senha digitada será exibida. Copie e cole essa chave de criptografia do terminal no script. Em seguida, comente a linha com o eco que exibiu a chave de criptografia no terminal.
Como o caminho /usr/local/bin
é maior na lista do que /bin
, nosso comando rm
é chamado. Depois de obter uma senha válida, chama /bin/rm
para fazer a remoção real.
O script chama logger
para gravar sempre que rm
foi chamado manualmente usando o terminal. O uso de comandos é registrado em /var/log/syslog
.
Retirado da resposta postada em ( Como posso configurar uma senha para o comando 'rm'? ) e modificada para exigir a senha do usuário root também.