
Estou apenas tentando adicionar um prompt de confirmação a alguns comandos do Linux como chmod
e chown
.
Tentei pesquisar isso no Google, mas não consigo encontrar muita informação sobre o assunto.
Durante a pesquisa descobri que existe uma solução para rm
usar a -i
opção, embora ela possa ser substituída por-f
No entanto, existe safe-rm
um pacote que você pode instalar em seu servidor que coloca na lista negra certos diretórios importantes, o que é uma solução bastante boa, mas infelizmente não existe um pacote semelhante para chmod
e chown
.
Portanto, minha solução ideal seria onde chmod
e chown
teria prompts de confirmação e também certos diretórios estão na lista negra para serem chmod-ed e chown-ed.
Qualquer resposta muito apreciada !!!
Responder1
Os comandoschown (1)echmod (1)não tenho essa opção nativamente. Se quiser adicionar essa funcionalidade, você:
- Tem que mudar a fonte e recompilar.
- Ou escreva um wrapper.
A primeira opção é a mais limpa. O segundo mais fácil. Se você não conseguir escrever isso, precisará de uma nova pergunta que provavelmente seja mais adequada para [SO], mas brevemente:
1) mova o chmod para outro lugar. por exemplomv /bin/chmod /bin/chmold.therealthing
2) Crie um script executável chamado chmod que faz o que você deseja (e que chama o chmod real).
Não testei algo de uma pessoa que não usa scripts de shell (também conhecido como eu:)
#!/usr/bin/env bash
echo "/bin/chmod (Shell script) called with these arguments:"
echo $@
read -p "Are you sure you want to do this? (y/n) " RESPONSE
if [ "$RESPONSE" = "y" ]; then
exec /bin/chmod.therealthing $@
else
echo "OK, aborting."
fi
se você quiser um controle mais granular, o script rapidamente se tornará mais complexo. Mesmo assim, você gostaria de poder analisar a entrada e executar um chmod para cada arquivo (depois de verificar uma sintaxe válida).
Responder2
Uma solução no bash seria usar funções e aliases do shell. Você pode colocá-los em /etc/bashrc ou ~/.bashrc se quiser apenas para usuários específicos. Aqui estão algumas definições de funções e alias que você pode usar para fazer algo parecido com o que você pediu.
DANGERLIST=/etc/dangerous.paths
_dangerouspath() {
file=$(readlink -e "$1")
[ -z "${file}" ] && return 1
while read pattern
do
[[ "${file}" =~ ^${pattern}$ ]] && return 0
done < ${DANGERLIST}
return 1
}
_checkpaths() {
shift
while [ -n "$1" ]
do
[[ "X$1" =~ ^X[^-].* ]] && _dangerouspath $1 && return 0
shift
done
return 1
}
_saferun() {
p="$1"
shift
if _checkpaths $*
then
read -p "Are you sure you want to do this? (y/n) " r && [ "$r" = "y" ] && $p $*
else
$p $*
fi
}
alias chown="_saferun /bin/chown"
alias chgrp="_saferun /bin/chgrp"
alias chmod="_saferun /bin/chmod"
Você precisaria criar uma lista de caminhos que deseja proteger em "$DANGERLIST" (/etc/dangerous.paths), que seria algo como
/
/home
/etc.*
/usr/bin.*
/bin.*