Prompt de confirmação para chmod, chown

Prompt de confirmação para chmod, chown

Estou apenas tentando adicionar um prompt de confirmação a alguns comandos do Linux como chmode 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 rmusar a -iopção, embora ela possa ser substituída por-f

No entanto, existe safe-rmum 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 chmode chown.

Portanto, minha solução ideal seria onde chmode chownteria 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ê:

  1. Tem que mudar a fonte e recompilar.
  2. 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.*

informação relacionada