Grave arquivos em pendrive sem sistema de arquivos
Publicado por Davidson Francis (última atualização em 28/08/2013)
[ Hits: 5.363 ]
Creio que este script sirva mais para curiosidade/estudo do que para ser utilizado cotidianamente, mas, talvez seja útil a alguém.
Basicamente o NTN (nome dado a simples falta de criatividade: Não Tem Nome) grava arquivos utilizando o dd, em conjunto com isso é gerado o que chamo de "header" (que será gravado junto com o arquivo desejado na mídia removível) que identifica o nome e tamanho do arquivo em questão (nos seus primeiros 30 bytes), para quando formos copiar o arquivo de volta para o HD (por exemplo) possamos saber exatamente o ponto em que o arquivo se encontra no pendrive. (afinal, estamos trabalhando na ausência de um FS).
Um ponto interessante de gravar arquivos desta maneira, é que apenas quem estiver de posse do NTN (e souber que o pendrive possua arquivos) poderá extraí-los de lá, afinal, nenhum S.O. irá conseguir montar a unidade.
O script em si permite a gravação de apenas um único arquivo, mas comprimindo podemos colocar a quantidade que bem entendermos.
O código em si é simples de entender, mas fico a disposição para eventuais dúvidas que possam ter.
* Peço desculpas a eventuais erros e POGs no script, afinal, esse é o meu primeiro (de muitos) Shell Script.
#!/bin/bash
clear
echo "------------------------------------------------"
echo "        NTN v1.1, by Davidson        "
echo "------------------------------------------------"
echo "################################################"
echo "# Nao utilize o disco rigido como destino                                               #"
echo "# para armazenamento e ao utilizar pendrives                                       #"
echo "# certifique-se de realizar backup.                                                        #"
echo "#                                                                                                       #"
echo "# Um metodo alternativo seria criar um arquivo                                     #"
echo "# como destino para o armazenamento.                                                #"
echo "################################################"
echo ""
function gravar()
{
    echo ""
    echo "Digite o nome do arquivo:"
    read arq2
    while [ ${#arq2} -gt 17 ]
    do
        echo "Nome muito grande, por favor renomeie para um menor!"
        read arq2
    done
    echo "Digite o caminho do dispositivo destino:"
    read destino
    echo ""
    echo "Criando header..."
    echo $(du -b $arq2 | cut -f1 -s) > .htmp
    tamanho=$(wc -m .htmp | cut -d' ' -f1)
    tamanho=$((10-$tamanho));
    #Obtencao/criacao do campo tamanho
    rm .h 2&>/dev/null
    while [ $tamanho -gt 0 ]
    do
        echo -n "0" >> .h
        tamanho=$(($tamanho-1));
    done
    cat .htmp >> .h
    rm  .htmp
    #Obtencao/criacao do campo nome arquivo
    echo "" >> .h
    tamanho=$((17-${#arq2}));
    while [ $tamanho -gt 0 ]
    do
        echo -en "0" >> .h
        tamanho=$(($tamanho-1));
    done
    echo -en "\t" >> .h
    echo $arq2 >> .h
    #Gravacao no dispositivo
    echo ""
    echo "------------------------"
    echo "Gravando header..."
    dd status=noxfer conv=notrunc if=./.h of=$destino 2>/dev/null
    echo ""
    echo "Gravando arquivo..."
    dd status=noxfer conv=notrunc if=./$arq2 of=$destino bs=1 obs=1 seek=30 2>/dev/null
    echo "------------------------"
    rm .h
}
function ler()
{
    echo ""
    echo "Digite o caminho do dispositivo:"
    read origem
    echo ""
    echo "------------------------"
    echo "Lendo header..."
    dd status=noxfer if=$origem of=.h bs=1 count=30 2>/dev/null
    echo ""
    echo "Gravando arquivo..."
    dd status=noxfer if=$origem of=$(tail -n1 .h | cut -f2 -s) bs=1 ibs=1 skip=30 count=$(head -n1 .h) 2>/dev/null
    echo "------------------------"
    rm .h
}
function criar_arquivo()
{
    echo ""
    echo "Qual do arquivo a ser gerado? i.e: 1K/2K... 1M/10M..."
    read opt
    echo ""
    echo "Gerando arquivo..."
    dd status=noxfer if=/dev/zero of=arq.bin bs=$opt count=1 2>/dev/null
}
echo "Deseja criar um arquivo para armazenamento(S/N) ?"
read opt
if [ $opt == 'S' ]
then
    criar_arquivo
fi
echo ""
echo "Deseja ler(1) ou escrever(2)?"
read opt
if [ $opt -eq 1 ]
then
    ler
else
    if [ $opt -eq 2 ]
    then
        gravar
    fi
fi
Ubuntu - Removendo kernels antigos
InstallDPKG reformulado - instalando pacotes DEB no Slackware
fwgen - gerador de regras de firewall iptables
IA Turbina o Desktop Linux enquanto distros renovam forças
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
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Problemas com Driver NVIDIA (5)
Warcraft II Remastered no Linux? (8)
Instalação dualboot Windows 11 e Debian 13 (7)









