Wrapper do dd com algumas medidas de segurança

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

[ Hits: 1.297 ]

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

A coisa funciona?

backup via ftp em formato tgz

Shoot - programinha para tirar screenshot pelo prompt

Quarentena para o ClamAV

Comparar 2 arquivos e mostrar os itens diferentes


  

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