Вот несколько трюков, которые я придумал за эти годы.
Вырежьте и вставьте в недружелюбный tty или неинтерактивный режим bash
Если вы находитесь в ситуации, когда EOF / ^ D / ^ F не обнаружен, вы можете использовать dd для передачи текстовых файлов на хост. Так как он остановит чтение после указанного количества байтов автоматически.
Я использовал это совсем недавно, в прошлом году, во время учений по безопасности, когда мы смогли получить нетитовые оболочки на удаленном хосте и нуждались в передаче файлов.
На самом деле, я даже создал пару двоичных файлов, кодируя их с помощью base64 и используя медленный, но надежный сценарий декодирования с использованием чистого bash base64.
dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>
Очень крутой трюк в том, что во время работы dd, если вы отправите ему сигнал USR1, он выдаст свое текущее состояние (считанные байты, байты в секунду ...)
Универсальный фильтр состояния пропускной способности
Я написал это, чтобы действовать как чистый фильтр прогресса bash для любой программы, которая генерирует данные через стандартный вывод. (Примечание: практически все что угодно будет генерировать данные через 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
файлы фрагментов с использованием анонимных дескрипторов оболочки
Вот чрезвычайно псевдокодовый пример того, как вы можете иметь подписанный tar-файл, который вы можете извлечь без ошибок, предоставляя ввод tar через анонимный дескриптор файла - без использования каких-либо файлов 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})
Я считаю, что дд невероятно полезен. И это только три примера, которые я могу придумать не покладая рук.