นี่คือเทคนิคบางอย่างที่ฉันได้ทำมานานหลายปี ..
ตัดและวางเพื่อทุบตีโหมด tty ที่ไม่เป็นมิตรหรือไม่โต้ตอบ
หากคุณอยู่ในสถานการณ์ที่ตรวจไม่พบ EOF / ^ D / ^ F คุณสามารถใช้ dd เพื่อถ่ายโอนไฟล์ข้อความไปยังโฮสต์ เนื่องจากมันจะหยุดอ่านหลังจากจำนวนไบต์ที่ระบุโดยอัตโนมัติ
ฉันใช้สิ่งนี้เมื่อเร็ว ๆ นี้เมื่อปีที่แล้วในระหว่างการฝึกความปลอดภัยซึ่งเราสามารถรับเชลล์ที่ไม่ใช่ tty บนรีโมตโฮสต์และต้องการถ่ายโอนไฟล์
ในความเป็นจริงฉันยังได้ไบนารีไฟล์สองไฟล์โดยการเข้ารหัส base64 และใช้สคริปต์การถอดรหัส pure-bash base64 แบบช้า แต่เชื่อถือได้
dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>
เคล็ดลับที่เด็ดสุด ๆ คือขณะที่ dd กำลังทำงานหากคุณส่งสัญญาณ USR1 มันจะปล่อยสถานะปัจจุบัน (อ่านไบต์ไบต์ต่อวินาที .. )
ตัวกรองสถานะปริมาณงานทั่วไป
ฉันเขียนสิ่งนี้เพื่อทำหน้าที่เป็นตัวกรองความคืบหน้าของ bash บริสุทธิ์สำหรับโปรแกรมใด ๆ ที่ปล่อยข้อมูลผ่าน stdout (หมายเหตุ: ทุกอย่างจะปล่อยข้อมูลผ่าน stdout มาก - สำหรับโปรแกรมที่ไม่สามารถโกงได้หากพวกเขาไม่สร้างปัญหาให้คุณโดยใช้ / dev / stdout เป็นชื่อไฟล์ แต่ความคิดนั้นโดยทั่วไปทุกครั้งที่คุณได้ X จำนวนไบต์, พิมพ์เครื่องหมายแฮช (เช่น FTP โรงเรียนเก่าเมื่อคุณเปิดโหมดแฮช)
(หมายเหตุ) สิ่งที่ไฟล์ความคืบหน้าเป็นง่อยนี่เป็นส่วนใหญ่พิสูจน์แนวคิด ถ้าฉันเปลี่ยนมันฉันก็แค่ใช้ตัวแปร
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
ไฟล์ slice-and-dice โดยใช้เชลล์ filehandles ที่ไม่ระบุชื่อ
นี่คือตัวอย่างรหัสเทียมอย่างยิ่งเกี่ยวกับวิธีที่คุณสามารถมีไฟล์ tar ที่ลงชื่อแล้วซึ่งคุณสามารถแตกไฟล์โดยไม่มีข้อผิดพลาดโดยให้ข้อมูลอินพุต tar ผ่าน filehandle แบบไม่ระบุชื่อโดยไม่ใช้ไฟล์ tmp ใด ๆ เพื่อจัดเก็บข้อมูลไฟล์บางส่วน
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 คือ: ฉันพบว่า dd มีประโยชน์อย่างไม่น่าเชื่อ และนี่เป็นเพียงสามตัวอย่างที่ฉันสามารถนึกได้จากส่วนบนของหัว