Wrapper do dd com algumas medidas de segurança
Publicado por João Gabriel (última atualização em 11/12/2021)
[ Hits: 1.648 ]
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[@]}"
verificar os maiores arquivos no HD
tira_usb.sh - Remover dispositivo USB
Script para atualização do UVSCAN
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Opções secretas em tema do Cinnamon
Como mapear unidade de rede no Linux
Como quebrar senha usando john the ripper
Não consigo instalar distro antiga no virtualbox nem direto no hd (25)
queria saber como posso alterar a frequencia do meu ryzen 2300u pro (3)









