Dưới đây là một số thủ thuật dd tôi đã nghĩ ra trong nhiều năm qua ..
Cắt và dán trên bash chế độ không thân thiện hoặc không tương tác
Nếu bạn đang ở trong tình huống không phát hiện thấy EOF / ^ D / ^ F, bạn có thể sử dụng dd để truyền tệp văn bản đến máy chủ lưu trữ. Vì nó sẽ dừng đọc sau một lượng byte được chỉ định tự động.
Tôi đã sử dụng điều này gần đây như năm ngoái trong một cuộc tập trận bảo mật nơi chúng tôi có thể nhận được các shell không tty trên một máy chủ từ xa và cần phải chuyển các tập tin vào.
Trong thực tế, tôi thậm chí đã thực hiện một vài tệp nhị phân bằng cách mã hóa base64 và sử dụng tập lệnh giải mã base64 bash chậm nhưng đáng tin cậy.
dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>
Một mẹo cực hay là trong khi dd đang chạy, nếu bạn gửi tín hiệu USR1, nó sẽ phát ra trạng thái hiện tại (byte đọc, byte mỗi giây ..)
Bộ lọc trạng thái thông lượng phổ quát
Tôi đã viết cái này để hoạt động như một bộ lọc tiến trình bash thuần túy cho bất kỳ chương trình nào phát ra dữ liệu thông qua thiết bị xuất chuẩn. (Lưu ý: Khá nhiều thứ sẽ phát ra dữ liệu thông qua thiết bị xuất chuẩn - đối với các chương trình không có, bạn có thể gian lận nếu chúng không chặn bạn bằng cách sử dụng / dev / stdout làm tên tệp. Nhưng về cơ bản, mỗi khi bạn nhận được X số lượng byte, in dấu băm (như FTP trường học cũ khi bạn bật chế độ băm)
(Lưu ý) Điều tập tin tiến trình là khập khiễng, điều này chủ yếu là một bằng chứng về khái niệm. Nếu tôi làm lại nó, tôi sẽ sử dụng một biến.
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
tập tin lát và sử dụng tập tin shell ẩn danh
Đây là một ví dụ mã giả cực kỳ về cách bạn có thể có một tệp tar đã ký mà bạn có thể trích xuất mà không gặp lỗi bằng cách cung cấp đầu vào tar thông qua một tập tin ẩn danh - mà không sử dụng bất kỳ tệp tmp nào để lưu trữ dữ liệu tệp một phần.
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})
Các tl; dr là: Tôi thấy dd cực kỳ hữu ích. Và đây chỉ là ba ví dụ tôi có thể nghĩ ra khỏi đỉnh đầu.