Aqui estão alguns truques que eu inventei ao longo dos anos.
Recortar e colar no modo tty ou não interativo hostil
Se você estiver em uma situação em que EOF / ^ D / ^ F não for detectado, use dd para transferir arquivos de texto para um host. Uma vez que ele irá parar de ler automaticamente após uma quantidade especificada de bytes.
Usei isso recentemente no ano passado, durante um exercício de segurança em que conseguimos obter shells não-tty em um host remoto e precisávamos transferir arquivos.
Na verdade, eu até criei alguns arquivos binários codificando-os em base64 e usando um script de decodificação de base64 lento, mas confiável.
dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>
Um truque super bacana é que, enquanto o dd estiver em execução, se você enviar um sinal USR1, ele emitirá seu status atual (bytes lidos, bytes por segundo ..)
Filtro de estado de rendimento universal
Eu escrevi isso para atuar como um filtro de progresso do bash puro para qualquer programa que emita dados através do stdout. (Nota: praticamente qualquer coisa emitirá dados através do stdout - para programas que não o fazem, você pode trapacear se eles não vomitarem usando o / dev / stdout como um nome de arquivo. Mas a idéia é basicamente, toda vez que você obtém o X quantidade de bytes, imprimir marcas de hash (como o FTP da velha escola quando o modo de hash estava ativado)
(Nota) A coisa do arquivo de progresso é esfarrapada, isso era principalmente uma prova de conceito. Se eu refizesse, usaria apenas uma variável.
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
arquivos de fatia e dados usando manipuladores de arquivos de shell anônimos
Aqui está um exemplo extremamente pseudo-código de como você pode ter um arquivo tar assinado que pode ser extraído sem erros, fornecendo entrada tar através de um tratamento de arquivos anônimo - sem usar nenhum arquivo tmp para armazenar dados parciais do arquivo.
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})
O tl; dr é: acho que o dd é incrivelmente útil. E esses são apenas os três exemplos em que consigo pensar.