Aquí hay algunos trucos de dd que he inventado a lo largo de los años.
Cortar y pegar en tty hostil o bash en modo no interactivo
Si se encuentra en una situación en la que no se detecta EOF / ^ D / ^ F, puede usar dd para transferir archivos de texto a un host. Ya que dejará de leer después de una cantidad especificada de bytes automáticamente.
Utilicé esto tan recientemente como el año pasado durante un ejercicio de seguridad en el que pudimos obtener shells no tty en un host remoto y necesité transferir archivos.
De hecho, incluso hice un par de archivos binarios codificándolos en base64 y usando un script de decodificación de base64 puro, lento pero confiable.
dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>
Un truco genial es que mientras dd se está ejecutando, si le envía una señal USR1, emitirá su estado actual (bytes leídos, bytes por segundo ...)
Filtro de estado de rendimiento universal
Escribí esto para actuar como un filtro de progreso de bash puro para cualquier programa que emita datos a través de stdout. (Nota: casi cualquier cosa emitirá datos a través de stdout: para los programas que no lo hacen, puedes hacer trampa si no te molestan usando / dev / stdout como nombre de archivo. Pero la idea es básicamente, cada vez que obtienes X cantidad de bytes, imprimir marcas hash (como FTP de la vieja escuela cuando tenía activado el modo hash)
(Nota) Lo del archivo de progreso es poco convincente, esto fue principalmente una prueba de concepto. Si lo rehizo, solo usaría una variable.
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
archivos de cortar y cortar dados utilizando manijas anónimas de shell
Aquí hay un ejemplo extremadamente pseudocódigo de cómo puede tener un archivo tar firmado que puede extraer sin errores al proporcionar entrada tar a través de un identificador de archivo anónimo, sin usar ningún archivo tmp para almacenar datos parciales del archivo.
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})
El tl; dr es: encuentro dd increíblemente útil. Y estos son solo los tres ejemplos que se me ocurren en la cabeza.