Wrapper do dd com algumas medidas de segurança

Publicado por João Gabriel (última atualização em 11/12/2021)

[ Hits: 1.683 ]

Download safedd




O safedd é um script wrapper do dd, que aceita o mesmo formato de parâmetros que o dd e passa os parâmetros do script para o dd.

Recursos de segurança:
- Avisa o usuário quando um dispositivo não-removível é usado como arquivo de saída, já que o dd é *geralmente* apenas usado em dispositivos removíveis.
- Avisa o usuário quando um arquivo comum com tamanho maior que zero for usado como arquivo de saída.
- Avisa o usuário se ele tentar gravar numa partição, visto que o dd é *geralmente* usado para gravar no disco inteiro, não apenas em uma partição.
- Impede o usuário de usar dd em sistemas de arquivos montados e sistemas de arquivos essenciais (/, /boot, /home, swapfiles ou partições swap, etc.)
- Impede o usuário de usar dd se o arquivo de entrada for maior do que o arquivo de saída (apenas se aplica quando o arquivo de saída é um dispositivo de armazenamento, onde a falta de espaço pode corromper dados)
- Executa o lsblk antes de executar o dd para que o usuário possa conferir os dados.

REQUER: bash, grep e dd

É claro que ainda há riscos mesmo ao usar esse script: todo cuidado é pouco! por isso sempre confira seus dispositivos, e, se possível, fisicamente remova os que você não quer destruir sem querer.

Dica: Quando for fazer *qualquer coisa* envolvendo dispositivos de armazenamento e partições, ao invês de usar /dev/sd*, use /dev/disk/by-label/<label do disco> ou /dev/disk/by-id/ata-*, pois é muito mais difícil de um erro de digitação acabar apagando um disco inteiro, e é muito mais fácil de conferir que é o disco certo.

  



Esconder código-fonte

#!/usr/bin/env bash

## Script wrapper do dd que adiciona itens de precaução e segurança
## Por goll72

## Requer: bash, grep, dd

usage() {
    cat << EOF
Uso: $0 [OPÇÕES]
Um wrappper do dd, porém com medidas de segurança.
As mesmas opções do dd são suportadas, veja dd --help.

    --help          Mostra esse menu de ajuda.
EOF
exit 0
}


# Interpreta as opções
[ $# -lt 1 ] && usage

[[ "$1" == '--help' ]] && usage

args=("${@#$0}")

# Obtém as variáveis if e of.
for i in "${args[@]}"; do
    if=${if:-"$(grep -Po "if=\K.*" <<< "$i")"}
    of=${of:-"$(grep -Po "of=\K.*" <<< "$i")"}
done

# Garante que o script funcionará mesmo quando if e / ou of são symlinks (/dev/disk/by-id/ata*, por exemplo)
if=$(realpath "$if")
of=$(realpath "$of")


# Medidas de segurança
# Avisos são utilizados em situações incomuns
# Impedimentos são utilizados em situações catastróficas
if [[ "$of" == '/dev/sd'* ]]; then
    # Cria uma variável temporária para trabalhar com o dispositivo inteiro se apenas a partição foi dada na linha de comando.
    if grep -P '/dev/sd.\d' &>/dev/null <<< "$of"; then
        dev_of=${of::-1}
    else
        dev_of="$of"
    fi

    removable_attr=$(cat /sys/block/"$(basename "$dev_of")"/removable)

    # Obtém o tamanho de if
    [ -f "$if" ] && if_size=$(stat -c %s -- "$if")
    [ -b "$if" ] && if_size=$(lsblk -bno SIZE "$if" | head -n1)
    # Obtém o tamanho de of
    of_size=$(lsblk -bno SIZE "$of" | head -n1)

    # Impede o usuário de gravar uma imagem maior do que o dispositivo
    [ "$if_size" -gt "$of_size" ] && {
        echo
        echo "$if é maior do que o dispositivo $of! Impedindo a execução do dd! Saindo ..."
        exit 1
    }

    # Impede o usuário de usar dd no /, /boot, /home ou /usr.
    check_mounted() {
        grep "$of $1 " /proc/mounts &>/dev/null && {
            echo "$of está montado em $1. Impedindo a execução do dd em $1! Saindo ..."
            exit 1
        }
    }

    check_mounted /
    check_mounted /home
    check_mounted /boot
    check_mounted /usr

    # Impede o usuário de usar dd em um swapfile ou partição swap
    grep "$of" /proc/swaps &>/dev/null && {
        echo "$of é um swapfile ou partição swap! Impedindo a execução do dd! Saindo ..."
        exit 1
    }

    # Impede o usuário de usar dd num dispositivo montado
    grep -P "$of /.*" /proc/mounts &>/dev/null && {
        echo "$of está montado. Desmonte $of antes de executar dd."
        exit 1
    }

    # Avisa o usuário se o dispositivo não for removível
    [ "$removable_attr" -eq 0 ] && {
        echo "O dispositivo $dev_of não é removível."
        echo
        echo "O dd geralmente é usado para gravar em dispositivos removíveis."
        echo
        echo "Deseja continuar ?"
        echo
        read -rp 'Pressione Enter para continuar ou Ctrl + C para sair. ' temp
    }

    # Avisa o usuário caso ele tente gravar numa partição
    [ "$dev_of" != "$of" ] && {
        echo "Você está utilizando dd numa partição: $of."
        echo
        echo "O dd geralmente é utilizado para gravar no disco inteiro, não numa partição."
        echo
        echo "Deseja continuar ?"
        echo
        read -rp 'Pressione Enter para continuar ou Ctrl + C para sair. ' temp
    }

    # Executa o lsblk para o usuário conferir outros dados do dispositivo
    echo "Executando lsblk ..."
    echo
    lsblk -o NAME,SIZE,RO,TYPE,MOUNTPOINT,MODEL

elif [ -f "$of" ] && [ -s "$of" ]; then
    echo "Você está executando dd num arquivo comum com tamanho maior do que zero."
    echo
    echo "Nesse arquivo pode haver dados importantes."
    echo
    echo -en "Tipo de arquivo: "; file -b --mime-type "$of" | grep text && { echo; echo "Conteúdo do arquivo de texto: $of"; echo ; cat "$of"; }
    echo
    read -rp 'Pressione Enter para continuar e Ctrl + C para sair. ' temp
fi


# Confirmação pelo usuário
echo
echo "Linha de comando: dd ${args[*]}"
echo
read -rp "Confirma a execução do dd ? [s/N] " confirm

[[ "$confirm" != 's|S' ]] && exit 0


# Executa o dd
## dd "${args[@]}"

Scripts recomendados

Configuração do vim

Compactando arquivos em lote

Contador de tempo de execução

Script em Yad para baixar vídeos ou áudio em MP3 do Youtube.

Renomeador Automático de Arquivos de Mídia


  

Comentários
[1] Comentário enviado por maurixnovatrento em 11/12/2021 - 11:51h


Gostei da parada.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]

[2] Comentário enviado por NidoBr em 11/12/2021 - 22:15h


Legal!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts