Wrapper do dd com algumas medidas de segurança
Publicado por João Gabriel (última atualização em 11/12/2021)
[ Hits: 1.297 ]
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[@]}"
Shoot - programinha para tirar screenshot pelo prompt
Comparar 2 arquivos e mostrar os itens diferentes
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (11)