Oto kilka sztuczek dd, które wymyśliłem przez lata ..
Wytnij i wklej w nieprzyjaznym bicie w trybie tty lub nieinteraktywnym
Jeśli jesteś w sytuacji, gdy EOF / ^ D / ^ F nie zostanie wykryty, możesz użyć dd do przesłania plików tekstowych do hosta. Ponieważ przestanie czytać automatycznie po określonej ilości bajtów.
Użyłem tego jeszcze w zeszłym roku podczas ćwiczenia bezpieczeństwa, w którym mogliśmy uzyskać powłoki non-tty na zdalnym hoście i potrzebowaliśmy przenieść pliki.
W rzeczywistości zrobiłem nawet kilka plików binarnych, kodując je base64 i używając powolnego, ale niezawodnego skryptu dekodowania base64 w czystym stylu.
dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>
Super fajna sztuczka polega na tym, że gdy dd jest uruchomiony, jeśli wyślesz mu sygnał USR1, wyemituje swój bieżący status (odczytane bajty, bajty na sekundę ..)
Uniwersalny filtr stanu przepustowości
Napisałem to, aby działało jako czysty filtr postępu dla każdego programu, który emituje dane przez standardowe wyjście. (Uwaga: prawie wszystko wysyła dane przez stdout - w przypadku programów, które tego nie robią, możesz oszukiwać, jeśli nie przeszkadzają ci przy użyciu / dev / stdout jako nazwy pliku. Ale pomysł jest w zasadzie za każdym razem, gdy dostajesz X ilość bajtów, wydrukuj znaki skrótu (jak oldschoolowy FTP, gdy miałeś włączony tryb skrótu)
(Uwaga) Plik postępu jest kiepski, był to głównie dowód koncepcji. Gdybym to zrobił, użyłbym zmiennej.
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
wycinanie i krojenie plików za pomocą anonimowych uchwytów plików powłoki
Oto niezwykle pseudo-kodowy przykład tego, w jaki sposób można podpisać plik tar, który można wyodrębnić bez błędów, wprowadzając dane tar za pomocą anonimowego uchwytu pliku - bez użycia plików tmp do przechowywania częściowych danych pliku.
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})
Tl; dr to: uważam, że dd jest niezwykle przydatny. A to tylko trzy przykłady, które mogę wymyślić z góry.