Ecco alcuni trucchi dd che ho escogitato negli anni ..
Taglia e incolla su tty ostile o in modalità non interattiva bash
Se ti trovi in una situazione in cui EOF / ^ D / ^ F non viene rilevato, puoi usare dd per trasferire file di testo su un host. Dal momento che smetterà di leggere automaticamente dopo un determinato numero di byte.
L'ho usato solo l'anno scorso durante un esercizio di sicurezza in cui siamo riusciti a ottenere shell non tty su un host remoto e dovevamo trasferire i file.
In effetti, ho anche fatto un paio di file binari codificandoli in base64 e usando uno script di decodifica base64 lento ma affidabile.
dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>
Un trucco super cool è che mentre dd è in esecuzione, se gli invii un segnale USR1, emetterà il suo stato corrente (byte letti, byte al secondo ..)
Filtro stato throughput universale
Ho scritto questo per fungere da puro filtro di avanzamento bash per qualsiasi programma che emette dati tramite stdout. (Nota: praticamente qualsiasi cosa emetterà dati tramite stdout - per i programmi che non lo fanno, puoi imbrogliare se non ti rubano usando / dev / stdout come nome file. Ma l'idea è fondamentalmente, ogni volta che ottieni X quantità di byte, segni di hash di stampa (come FTP della vecchia scuola quando era attiva la modalità hash)
(Nota) La cosa del file di progresso è scadente, questa era principalmente una prova del concetto. Se lo ripetessi, utilizzerei solo una variabile.
dd bs=$BLKSZ of=${TMPFILE} 2>&1 \
| grep --line-buffered -E '[[:digit:]]* bytes' \
| awk '{ print $1 }' >> ${PROGRESS} &
while [[ $(pidof dd) -gt 1 ]]; do
# PROTIP: You can sleep partial seconds
sleep .5
# Force dd to update us on it's progress (which gets
# redirected to $PROGRESS file.
pkill -USR1 dd
local BYTES_THIS_CYCLE=$(tail -1 $PROGRESS)
local XFER_BLKS=$(((BYTES_THIS_CYCLE-BYTES_LAST_CYCLE)/BLKSZ))
if [ $XFER_BLKS -gt 0 ]; then
printf "#%0.s" $(seq 0 $XFER_BLKS)
BYTES_LAST_CYCLE=$BYTES_THIS_CYCLE
fi
done
file slice-and-dice usando filehandle di shell anonimi
Ecco un esempio estremamente pseudo-codice di come è possibile avere un file tar firmato che è possibile estrarre senza errori fornendo input tar tramite un filehandle anonimo - senza utilizzare alcun file tmp per archiviare i dati parziali del file.
generate_hash() {
echo "yay!"
}
# Create a tar file, generate a hash, append it to the end
tar -cf log.tar /var/log/* 2>/dev/null
TARFILE_SIZE=$(stat -f "%z" log.tar)
SIGNATURE=$(generate_hash log.tar)
echo $SIGNATURE >>log.tar
# Then, later, extract without getting an error..
tar xvf <(dd if=$OLDPWD/log.tar bs=1 count=${TARFILE_SIZE})
Il tl; dr è: trovo che dd sia incredibilmente utile. E questi sono solo i tre esempi a cui riesco a pensare dalla cima della mia testa.