Wrapper do dd com algumas medidas de segurança
Publicado por João Gabriel (última atualização em 11/12/2021)
[ Hits: 1.361 ]
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.
#!/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[@]}"
Avisar quando partição estiver 90% ocupada
Script para Conexão Automática com Internet a Rádio
dep-info - verificar se o programa está instalado no sistema
CONTROLE DE ACESSOS PELO SQUID
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Máquinas Virtuais com IP estático acessando Internet no Virtualbox
Criar entrada no GRUB para uma ISO Linux (2)
Meus HDs não aparecem mais no boot da placa mãe (20)
Problema em instalar o PySide6 no Ubuntu 24.04 [RESOLVIDO] (3)