5

コマンドが 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」は実行されません。

ファイルを使用せずに解決するにはどうすればよいですか (セキュリティ上の理由から)。

4

3 に答える 3

9

解決策を提案する前に、これが想像以上に難しいことを説明させてください。基本的な問題はタイミングです。open ...関数は実行時に出力を生成します。実行が終了した後 (したがって、出力が生成された後) に終了ステータスが生成されます。終了ステータスに応じて出力でさまざまなことをしたいので、関数が終了するまで出力を一時的にどこかに保存する必要があり、出力をどうするかを決めることができます。

パイプはデータを保存しないため (わずかなバッファ スペースを除いて)、本質的にパイプは機能しません。パイプはデータをあるプログラムから別のプログラムに "ライブ" で渡します。この場合、2 番目のプログラムは起動できません。最初が終わるまで。通常、これには一時ファイルが最適ですが (ファイルの目的はデータの保存です)、セキュリティ上の理由からそれは望ましくありません。これにより、データをRAMのどこかに配置する必要がほとんどなくなります(ただし、完全に安全というわけではありません...)。

@Karoly Horvath の回答では、出力を bash 変数 (RAM に格納) に格納することを提案しましたが、bash は変数値の null バイトに対応していないため、うまくいきませんでした。そこで、データの「安全な」エンコーディングを使用し、それを bash 変数に入れるバリアントを提案します。私は uu​​encode 形式を使用しましたが、base64 や 16 進ダンプなども使用できます...

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

PIPESTATUS はバシズムであるため、スクリプトを で開始する必要があることに注意してください#!/bin/bash。また、出力が長すぎる場合、bash が保存/展開/その他を希望するデータの量が制限される可能性があります。それが問題になると、事態はさらに複雑になります。

ところで、セキュリティが心配な場合は、gpg2 の--passphraseオプションを使用しないでください。コマンド ラインでパスフレーズを渡すとps、適切なタイミングで実行する人などに公開されてしまいます。これは非常に悪い考えです。gpg2 にはパスフレーズを提供するための多くのオプションがあるため、より良いものを使用してください。

于 2012-05-02T16:10:45.040 に答える
0

次のコードは、ファイルが正常に開かれた場合に条件付きで結果をパイプする必要があります。

   result=open "$@" "$PASSWORD"
    if [ $? -gt 0 ]; then
      exit 1
    fi
    echo "$result" | <SOMECOMMAND>
于 2012-05-02T11:44:15.733 に答える
0

名前付きパイプを使用して戻り値を格納する

mkfifo piper;
open "$@" "$PASSWORD"; retval=$? > piper &
if [ x"$retval" != x0 ]
then
   rm piper
   exit 1
fi
<SOMECOMMAND> < piper
rm piper
于 2012-05-02T14:34:04.643 に答える