Crie o alias com o comando concluído

0

Eu odeio rm -rf /* , então quero fazer eco em vez de executar rm -rf /* . Como posso tornar isso possível?

    
por 홍세정 02.08.2017 / 14:39

1 resposta

2

Por "ódio", eu presumo que você quer dizer que tem medo de executar isso acidentalmente?

O comando rm -r / (com ou sem -f ) solicitará:

rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe

Infelizmente, isso não é verificado quando você especifica /* , porque o último é expandido em cada pasta. Embora a maioria das pastas e seu conteúdo estejam seguros (porque você não usou sudo ), infelizmente, os que estão dentro da sua pasta pessoal serão excluídos.

Não há uma resposta simples para isso. Você poderia escrever uma função em .bashrc que verifica isso, mas seria bastante complexa: a função teria que:

  • Verifique as opções para saber se elas continham -r , -R ou --recursive e se você usou ou não --no-preserve-root .
  • Veja os parâmetros que não são de opção para descobrir se é provável que você tenha usado /* .

Eu acho que -f ou --force pode ser ignorado, porque sem isso, o comando ainda tem a capacidade de causar estragos.

Eu escrevi um script para fazer exatamente isso. Está abaixo. Basta adicionar isso ao final do seu arquivo ~/.bashrc , fechar todos os terminais abertos e reabrir o terminal, e isso deve funcionar.

Aviso, Aviso , AVISO, AVISO !

  1. Por favor, teste cuidadosamente antes de usá-lo ao vivo.
  2. Coloquei echo antes do comando rm real no script (logo no final), para permitir que você teste. Isso significa que quando você executá-lo, ele exibirá o comando em vez de executá-lo. Quando você tiver feito um teste completo, edite seu ~/.bashrc para remover a palavra echo .
  3. Isso se aplica ao seu terminal. Não aplica não ao root, ou seja, sudo. Assim, ainda causará estragos se você executar sudo rm -rf /* . Para fazer isso se aplicar ao sudo ... bem, deve haver um jeito, mas desculpe, eu não sei como. :( Tenho certeza de que alguém inteligente aqui vai descobrir, e nesse caso eu posso adicioná-lo a esta resposta. (Existe uma maneira de garantir que o sudo sempre use o mesmo ${PATH} , mas não acho que isso seja verdade.)

Aqui está o script:

#---------------------------------------------------------------------------------------------------
#    Amendment to rm
#
#    Check if it is likely that the user called rm on root with recursion but without the option
#    --no-preserve-root
#    If so, display a warning. Otherwise, allow rm to continue unhindered.
#---------------------------------------------------------------------------------------------------


function rm ()
{
    # Extract all of the options and parameters.
    local -r GETOPT="$( getopt --longoptions=force,interactive::,one-file-system,no-preserve-root,recursive,dir,verbose,help,version    \
                               --options=fiIrRdv -- "${@}"
                      )"

    # Replace the current parameters with the interpreted ones from rm.
    eval set -- "${GETOPT}"

    # Define variables to use in the function.
    local -i FILES_COUNT=0                              # The number of files and folders found.
    local ALL_ROOT=true                                 # Assume true unless found otherwise.
    local RECURSIVE_USED=false                          # Unless found true.
    local NO_PRESERVE_ROOT_USED=false                   # Unless found true.
    local PARAM                                         # To hold the parameter being inspected.
    local INTERACTIVE_STATE=false                       # Whether we are expecting an option to --interactive.

    # Run through the parameters to find if we should catch this command.
    for PARAM
    do
        # Handle the option --interactive first.
        if ${INTERACTIVE_STATE}
        then
            INTERACTIVE_STATE=false                     # Turn off the interactive state.

        elif [[ ${PARAM} == '--interactive' ]]
        then
            INTERACTIVE_STATE=true

        elif [[ ${PARAM} == '-r' || ${PARAM} == '-R' || ${PARAM} == '--recursive' ]]
        then
            RECURSIVE_USED=true

        elif [[ ${PARAM} == '--no-preserve-root' ]]
        then
            NO_PRESERVE_ROOT_USED=true

        elif [[ ${PARAM} =~ ^- ]]
        then
             :                                          # Ignore any option that we don't care about.                          

        else
            : $(( ++FILES_COUNT ))                      # Keep count.
            if ! [[ ${PARAM} =~ ^/ ]]
            then
                 ALL_ROOT=false                         # This isn't a root file or folder.
            fi
        fi
    done

    # Is this likely to be the command that we are searching for?
    if (( FILES_COUNT > 0 )) && ${RECURSIVE_USED} && ${ALL_ROOT} && ! ${NO_PRESERVE_ROOT_USED}
    then
        # Yes! Recursive; all root files and folders; and missing no-preserve-root.
        # Leave a message and exit with an error.
        echo 'You are using rm to remove all root files and folders.'         >&2
        echo 'Please use --no-preserve-root if that is really what you want.' >&2
        return 3
    fi

    # No, this is (supposedly) safe. Run the command.
    echo rm "${@}"

} # rm
    
por Paddy Landau 02.08.2017 / 16:24