Voici quelques astuces que j'ai trouvées au fil des ans.
Couper-coller en mode non-interactif ou non-interactif bash
Si vous êtes dans une situation où EOF / ^ D / ^ F n'est pas détecté, vous pouvez utiliser dd pour transférer des fichiers texte sur un hôte. Puisqu'il arrêtera de lire automatiquement après une quantité d'octets spécifiée.
Je l’utilisais aussi récemment que l’année dernière lors d’un exercice de sécurité au cours duquel nous pouvions obtenir des shells non-tty sur un hôte distant et que nous devions transférer des fichiers.
En fait, j'ai même créé quelques fichiers binaires en les encodant en base64 et en utilisant un script de décodage base64 lent-fiable, mais fiable.
dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>
Une astuce géniale est que pendant que dd est en cours d’exécution, si vous lui envoyez un signal USR1, il émettra son statut actuel (octets lus, octets par seconde, etc.).
Filtre d'état de débit universel
J'ai écrit ceci pour agir comme un filtre de progrès pur bash pour tout programme qui émet des données via stdout. (Remarque: à peu près tout ce qui émettra des données via stdout - pour les programmes qui ne le font pas, vous pouvez tricher s'ils ne vous critiquent pas en utilisant / dev / stdout en tant que nom de fichier. Mais l'idée est fondamentalement que chaque fois que vous obtenez X nombre d'octets, marques de hachage d'impression (comme l'ancien FTP de l'école lorsque le mode de hachage était activé)
(Note) Le dossier de progression est boiteux, c'était principalement une preuve de concept. Si je le refais, je n'utiliserais qu'une 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
fichiers slice-and-dice utilisant des descripteurs de fichiers shell anonymes
Voici un exemple extrêmement pseudo-code de la manière dont vous pouvez obtenir un fichier tar signé que vous pouvez extraire sans erreur en fournissant une entrée tar via un descripteur de fichier anonyme - sans utiliser de fichier tmp pour stocker des données de fichier partielles.
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})
Le tl; dr est: je trouve que dd est incroyablement utile. Et ce ne sont que les trois exemples auxquels je peux penser de façon spontanée.