加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash条件管道

发布时间:2020-12-15 22:00:21 所属栏目:安全 来源:网络整理
导读:如果它返回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 filennDettagli:n$(grep -v '^$' $TEMPF
如果它返回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 filennDettagli: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”.

如何在不使用文件的情况下解决(出于安全原因).

解决方法

在我提出解决方案之前,让我解释一下这比你意识到的更困难.基本问题是时间:open …函数在运行时产生输出;它在完成运行后产生退出状态(因此在它产生输出后).由于您希望根据退出状态对输出执行不同的操作,因此必须将输出临时存储到函数完成之前,您可以决定如何处理输出.

管道本身不适用于此,因为管道不存储数据(除了一点缓冲区空间) – 它们将数据“实时”从一个程序传递到另一个程序,在这种情况下第二个程序无法启动直到第一次完成之后.通常,临时文件对于此来说是完美的(存储数据是文件的用途),但出于安全原因,您不希望这样.这几乎把数据放在RAM中的某个地方(虽然这也不是很安全……).

@Karoly Horvath的回答建议将输出存储在一个bash变量(存储在RAM中)中,但这不起作用,因为bash不能处理变量值中的空字节.因此,我提出了一种变体,您可以使用数据的“安全”编码,并将其放在bash变量中.我使用了uuencode格式,但你也可以使用base64,hex dump等…

if result=$(open "$@" "$PASSWORD" | uuencode -; exit ${PIPESTATUS[0]}); then
    echo "$result" | uudecode -p | SOMECOMMAND
fi

请注意,PIPESTATUS是一种基础,因此您应该使用#!/ bin / bash启动脚本.此外,如果输出太长,您可能会限制bash想要存储/扩展/等的数据量;如果事实证明是一个问题,事情变得更加复杂.

顺便说一句,如果你担心安全问题,不要使用gpg2的–passphrase选项 – 在命令行上传递密码短语会将其暴露给例如任何在正确的时间运行ps的人,这是一个非常糟糕的主意. gpg2有很多提供密码的选项,所以请使用更好的密码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读