Wrapper do dd com algumas medidas de segurança
Publicado por João Gabriel (última atualização em 11/12/2021)
[ Hits: 1.300 ]
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[@]}"
usando a lixeira em modo texto
Apagar arquivos maliciosos de pastas compartilhadas pelo Samba periodicamente
Alternador de wallpaper para GNOME
Juntando páginas separadas num único PDF
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? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)