如果它返回true,我如何管道输出命令?
function open
{
TEMPFILE=$(mktemp -u)
if ! gpg2 --quiet --decrypt --batch --passphrase "$2" "$1" 2> $TEMPFILE; then
error $"Password errata od errore di lettura dal file\n\nDettagli:\n$(grep -v '^$' $TEMPFILE)"
rm -f $TEMPFILE
return 1
fi
rm -f $TEMPFILE
}
if ! open "$@" "$PASSWORD"; then
exit 1
fi | <SOMECOMMAND>
这样,它只是管道,不检查open是返回true还是false,因此不会执行“exit 1”。
如何在不使用文件的情况下解决问题(出于安全考虑)。
答案 0 :(得分:8)
在我提出解决方案之前,让我解释一下这比你意识到的更困难。基本问题是时间:open ...
函数在运行时产生输出;它在运行完之后产生退出状态(因此在它产生输出之后)。由于您希望根据退出状态对输出执行不同的操作,因此必须将输出存储在临时位置,直到函数完成,然后您可以决定如何处理输出。
管道本身不适用于此,因为管道不存储数据(除了一点缓冲区空间) - 它们将数据“实时”从一个程序传递到另一个程序,在这种情况下第二个程序可以在第一次完成之后才开始。通常,临时文件对于此来说是完美的(存储数据是文件的用途),但出于安全原因,您不希望这样。这几乎把数据留在了RAM的某个地方(虽然这也不是很安全......)。
if result=$(open "$@" "$PASSWORD" | uuencode -; exit ${PIPESTATUS[0]}); then
echo "$result" | uudecode -p | SOMECOMMAND
fi
请注意,PIPESTATUS是一种基础,因此您应该使用#!/bin/bash
启动脚本。此外,如果输出太长,您可能会限制bash想要存储/扩展/等的数据量;如果事实证明是一个问题,事情会变得更复杂。
--passphrase
选项 - 在命令行上传递密码短语会将其暴露给例如任何在合适的时间运行ps
的人,这是一个非常糟糕的主意。 gpg2有很多提供密码的选项,所以请使用更好的密码。
答案 1 :(得分:0)
如果文件成功打开,以下代码应有条件地管道结果:
result=open "$@" "$PASSWORD"
if [ $? -gt 0 ]; then
exit 1
fi
echo "$result" | <SOMECOMMAND>
答案 2 :(得分:0)
使用命名管道并存储返回值
mkfifo piper;
open "$@" "$PASSWORD"; retval=$? > piper &
if [ x"$retval" != x0 ]
then
rm piper
exit 1
fi
<SOMECOMMAND> < piper
rm piper