Wrapper do dd com algumas medidas de segurança
Publicado por João Gabriel (última atualização em 11/12/2021)
[ Hits: 1.563 ]
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[@]}"
newchangelog - Script para gerar changelog.
Grave arquivos em pendrive sem sistema de arquivos
infonow - all system information
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
O programa assinador digital (0)
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)
Instalação não está resolvendo as dependencias (2)
Captação de áudio no zorin linux começa a diminuir com o tempo (5)









