Como posso destruir todos os discos mas / dev / sda e registrar a saída em um arquivo?

4

Estou tentando fazer um comando que tomará todas as unidades que não são sda e executará o shred nelas e despejará a saída em um arquivo de log. Até agora eu tenho

find /dev/ -name "sd?" -not -name "sda" -exec [shred -fvz {} > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I {} | grep 'Serial\ Number' |cut -f2- -d:).log 2>&1 &] \;

Como você pode ver, consegui uma boa distância nisso com a pesquisa do google, mas agora encontrei algo que não sei o que fazer porque a saída que obtive é

[1] 13097
{}: No such file or directory
]: command not found
[1]+  Exit 1                  find /dev/ -name "sd?" -not -name "sda" -exec [shred -fvz {} > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I {} | grep 'Serial\ Number' |cut -f2- -d:).log 2>&1

Alguém tem alguma sugestão?

Além disso, atualmente estou trabalhando nesse problema, mas sugestões seriam boas. Quando eu corro

shred -fvz /dev/sdb > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I /dev/sdb | grep 'Serial\ Number' |cut -f2- -d:).log 2>&1

Recebo um erro de redirecionamento ambíguo.

    
por Ben Stumpf 15.09.2016 / 16:24

2 respostas

2

EDIT: Embora a resposta original diga a você por que o comando find não funcionou, o loop que usa find não funcionará para HDDs USB. Role até o final da resposta para uma versão melhor.

Observe que o registro não funcionará com unidades flash USB; hdparm é apenas para HDDs.

Seu comando find não funcionará. Em absoluto. Por quê?

Existem alguns problemas, mas o principal deles é: A opção -exec procura no PATH para um executável com o nome do seu primeiro argumento e o executa com outros argumentos para find até um ponto e vírgula. Ele não passa seus argumentos para um shell, o que significa usar $(...) , redirecionamento, etc. não funcionará.

Como você conserta isso? Existem algumas maneiras.

O mais óbvio pode ser passar seu comando para um shell:

find . -name testing12345 -exec bash -c '...$(...)... > /path/to/some/file 2>&1' \;

Sim, isso funciona, mas em uma expressão complicada com vários tipos de citações, o escape pode rapidamente se tornar um pesadelo.

Geralmente, usar um loop é a maneira mais fácil de fazer isso. Como você já tem um comando find em funcionamento, a maneira mais fácil de fazer isso é retirar os argumentos -exec e enviá-los para um loop:

find (your find arguments here) -print0 | while IFS= read -r -d $'
find /dev/ -name "sd?" -not -name "sda" -print0 | while IFS= read -r -d $'
lsblk -ld | grep -o '^sd[b-z]' | while read -r filename; do
    filename="/dev/$filename"
    shred -fvz "$filename" > "/home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I "$filename" | grep -o 'Serial Number:\s*\S*' | cut -f2 -d: | sed 's/^\s*//').log" 2>&1 &
done
' filename; do if (hdparm -i "$filename" > /dev/null 2>&1); then shred -fvz "$filename" > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -i "$filename" | grep -o 'SerialNo=\S*' |cut -f2 -d=).log 2>&1 & fi done
' filename; do # process "$filename" done

IFS= e as opções -print0 e -d $'find' para read e -r evitam problemas com novas linhas em nomes de arquivos. A opção read garante que echo não processe as barras invertidas nos nomes dos arquivos.

Combinando isso e corrigindo seus outros problemas, nós conseguimos isso, o que parece funcionar:

find . -name testing12345 -exec bash -c '...$(...)... > /path/to/some/file 2>&1' \;

Eu mesmo testei com uma instrução shred no lugar de find , pois não quero destruir meus discos, então, por favor, diga-me se funciona.

EDIT: A versão lsblk está corrompida para HDDs USB. Esta versão modificada que usa %code% funciona corretamente:

find (your find arguments here) -print0 | while IFS= read -r -d $'
find /dev/ -name "sd?" -not -name "sda" -print0 | while IFS= read -r -d $'
lsblk -ld | grep -o '^sd[b-z]' | while read -r filename; do
    filename="/dev/$filename"
    shred -fvz "$filename" > "/home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I "$filename" | grep -o 'Serial Number:\s*\S*' | cut -f2 -d: | sed 's/^\s*//').log" 2>&1 &
done
' filename; do if (hdparm -i "$filename" > /dev/null 2>&1); then shred -fvz "$filename" > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -i "$filename" | grep -o 'SerialNo=\S*' |cut -f2 -d=).log 2>&1 & fi done
' filename; do # process "$filename" done
    
por insert_name_here 15.09.2016 / 19:05
2

Este script deve fazer o que você quiser. Observe que ele deve ser executado como root!

#!/bin/bash
logpath="/home/ben/ProjectsInProgress/ShredLogs"
lsblk -l | grep -o '^sd[b-z] ' | while read f; do
    logfile="$logpath/$(hdparm -i "/dev/$f" | grep -oP "(?<=SerialNo=)\w+")"
    shred -fvz "$f" &> "$logfile"
done

Graças a @ terdon por fornecer esta versão melhorada (e esperançosamente agora corrigida).

Por favor, diga-me se funciona, não estou realmente motivado para testar a destruição dos meus próprios discos ...

    
por Byte Commander 15.09.2016 / 16:52
Como copiar / sda3 para / sda1? UUIDs não podem ser semelhantes ______ qstntxt ___

/ dev / sda é um drive de 400 gig. É partições WERE: / sda1 - partição de inicialização do Windows (100 meg); / sda2 Windows "C: \" (68 gig); / sda3 é a partição de inicialização do Linux; / sda5 é a partição / home; / sda6 é troca de linux.

/ sda1 e / sda2 foram eliminados e / sda2 expandidos para / sda1.

Eu quero clonar / sda3 para / sda1 E ter o 12.04 (pangolin preciso) conhecido para inicializar de / sda1 e não de / sda3.

Como edito o / etc / fstab e o GRUB2 para que ele seja adequado (não tenho idéia de como usar palavras para expressar essa ideia) UUID? Eu sei que usando o GParted para "copiar" / sda3 para / sda1 requer a edição para fazer a partição copiada ter um UUID que não é uma correspondência (ou o mesmo número UUID como) a partição original (/ sda3). Que outros passos devo dar para não confundir o GRUB2 e o fstab para que eles funcionem harmoniosamente e eu não prejudique o sistema operacional / dados / outras coisas no disco rígido?

Em seguida, quero encolher / sda1 para 25 gig (atualmente 68 gig) e continuar / sda1 como inicialização. Então eu quero usar 43 gig de encolher / sda1, e adicioná-lo ao (ser) não utilizado / sda3 e depois expandir / sda5 para o / sda3 expandido

Não posso postar uma captura de tela do gparted, então aqui está o fdisk -l:

%pre%     
______ azszpr254018 ___

A maneira mais fácil, IMO, é inicializar o CD de desktop do Ubuntu. Você pode usar o gparted para copiar e colar suas partições.

O único truque com o gparted é que você deve aplicar as alterações um setp de cada vez.

Exclua sda1 - > aplicar alterações - > cópia sda3 - > colar - > aplicar alterações.

Depoisdetercopiadoapartição,vocêtambémpodeusarogpartedparacriarumnovoUUID

Selecioneapartição→NovoUUID

Monteapartiçãoem/mnt

%pre%

Editefstab,insiraonovoUUIDsobaentradadosistemadearquivosraiz.

RelacioneoUUID,senecessário,comoblkid

%pre%

Reinstale/atualizeogrub

%pre%

Vejatambém:

______ azszpr253997 ___

Existe uma razão específica pela qual você deseja mover a partição do Linux de 3 para 1? Você aponta para um ganho de desempenho ou é apenas por hábito?

O caminho mais fácil

  1. Encolher a partição do Linux a partir de um Live CD
  2. Excluir partição sda1
  3. Mova a partição sda2 para o início do seu disco rígido e sda3 para trás
  4. Estenda a partição estendida que contém sda5 e sda6

O caminho correto

  1. Encolher a partição do Linux para o mínimo a partir de um Live CD
  2. Mova as partições sda2 e sda3 o mais longe possível
  3. Redimensionar e formatar sda1
  4. Copie tudo de sda3 para sda1 com %code% , modyfiy fstab de acordo com sda1
  5. Reinstale o grub com %code%
  6. Excluir partição sda1
  7. Estenda a partição estendida que contém sda5 e sda6

Pro: A partição Linux está fisicamente em primeiro lugar (e também desfragmentou a partição Linux)

Con: Envolve a reinstalação do carregador de inicialização

O caminho sujo

  1. Divida a partição / dev / sda2 (o dispositivo) com %code% em um arquivo (como um disco rígido externo), anote o tamanho exato da partição e exclua-o assim como sda1
  2. Redimensione o sda3 para o tamanho desejado e mova-o para o início do seu disco rígido
  3. Recrie a partição do Windows e grave o dump de volta na partição (alterne arquivos / dispositivos de entrada e saída)
  4. Estenda a partição estendida que contém sda5 e sda6

Pro: A partição do Linux está fisicamente em primeiro lugar, não é necessário reinstalar o gerenciador de inicialização

Con: sda3 ainda é sda3 e o que foi sda2 pode ser sda1, tome cuidado para não gravar na partição errada com %code% , o despejo leva mais tempo enquanto copia tudo (até arquivos e fragmentos de arquivos que não existem mais)

Recomendação

Siga o caminho mais fácil. Se o desempenho for importante, compre um SSD. (Eu sei que esta é a frase mais usada nos dias de hoje, mas vale a pena o esforço.)

    
___ Quando é o próximo concurso de papel de parede da comunidade Ubuntu?