我们有以下情况:我们想从类似文件的流(/dev/ttyACM0
,所以是串行接口)中获取数据,并使用gpg对其进行加密。目前,我们使用
cat /dev/ttyACM0 | gpg -e -r [keyid] --trust-model always > output_file
我们的问题是:ttyACM0将在一定时间内传送数据,然后停止,但是ttyACM0本身将保留在原位,因此读取将继续并且gpg不会终止。如果我们使用超时(timeout [time] cat /dev/ttyACM0 | gpg ... &
)来运行整个过程,并让超时终止进程,则某些数据将丢失,并且在解密时,我们会收到一条错误消息:
gpg: block_filter 0x00005589367a73c0: read error (size=16358,a->size=16358)
gpg: block_filter 0x00005589367aab80: read error (size=13254,a->size=13254)
gpg: WARNING: encrypted message has been manipulated!
gpg: block_filter: pending bytes!
gpg: block_filter: pending bytes!
解密是可行的,但是最后缺少一些数据。这可能与GPG以非空缓冲区终止的事实有关。
我们如何在不因gpg缓冲而丢失某些数据的情况下使它起作用?我不知道有任何SIGXXX使gpg完成操作,写出结果然后终止。该过程应在Raspberry Pi Zero上运行,因此理想情况下,它不应在常规加密上引入大量开销,并且出于合规性原因,我们不能先将所有内容传输到文件中并随后对其进行加密,我们需要在收到文件后直接对其进行加密从串行接口。
如果将放在timeout
管道的中间,gpg
则将干净地退出:
cat /dev/ttyACM0 | timeout ${TIMEOUT} cat | gpg -e -r ${RECIPIENT} > ${OUT_FILE}
我无法完全解释这一点,但是我相信这是由于处理/传播管道错误(信号)的方式引起的。
注意:我问这个问题是为了更好地理解这一点。
请注意,即使使用以下内容也会失败:
$ timeout 5 cat < /dev/urandom | gpg -e -r ${RECIPIENT} > myfile.gpg
gpg: Terminated caught ... exiting
Terminated
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句