暗号化されたgpgをカールにストリーミングするコマンドがあります。
echo "Some Text" | gpg -o - | curl --silent -T - \
-X PUT \
--output /dev/null \
${myurl} \
これを実行すると、次の内容が表示されます。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0Enter passphrase
Passphrase:
ここで、この"Enter passphrase"
部分はカール出力転送に追加されます。パイプされた属性のため、改行文字を挿入できません。後でカール出力を実行する方法はありますか?
答え1
カール出力が古いパイプの出力を印刷するのを防ぐ方法は?
curl
「前パイプの出力」を印刷しないでください。何が起こると、一部のメッセージが端末に印刷されcurl
ます。gpg
これらのメッセージは互いに干渉します。
覚えてくださいパイプラインコマンドが同時に実行されます。。
gpg
成功出力が決して空にならないようにするには、次のようにします。ifne
:
… | gpg … | ifne curl …
(Debianではパッケージifne
にあります。)moreutils
の主な目的は、標準入力が空のときにコマンドifne
(ここで:)が実行されるのを防ぐことです。curl
標準入力が実際に空であることを確認するには、ツールはデータまたはEOFを待つ必要があります。これにより、実際のコマンドが遅延します。遅延だけで済みます。
gpg
正しいパスワードを受け取った後にのみ印刷を開始したいと思います。パスワードを求めるテストはifne
あらかじめ徹底させていませんでしたが、パスワードを尋ねるテストはしました。期待どおりに機能すれば役に立ちます。パスワードを入力した後に実行されます。gpg
sudo …
gpg
ifne
curl
Noteは、標準出力に何も印刷されない場合(パスワードが間違っている場合など)、実行をifne
防ぎます。この動作はしばしば必要です。ただし、成功の出力がnullになる可能性があり、まだパイプに入る必要がある場合は、単独で使用することは正しい選択ではありません。curl
gpg
gpg
curl
ifne
curl
何も印刷せずに実行するには、gpg
読み続けてください。
以下のコードはreport
私のスクリプトの単純化されたバージョンです。この回答。別の名前で保存してくださいdelay
。
ifne
より複雑な方法で使用されます。コードは実行可能なスクリプトでなければなりません(シェル関数で作成しようとしないでください)。なぜなら、コードは独自の呼び出しを介して実行されるからですifne "$0"
(そしてifne
関数は実行できません)。
#!/bin/bash
if [ "$1" = "-X" ]; then
marker=1
fd="$2"
shift 2
else
unset marker
exec {fd}>&1
fi
if [ "$marker" ]; then
( >&"$fd" "$@" )
else
ifne -n "$0" -X "$fd" "$@" | ifne "$0" -X "$fd" "$@"
fi
の目的は、delay
標準入力またはEOFにデータがあるまでコマンドの実行を遅らせることです。後で使用するように設計されています|
。
次のように使用する必要があります。
… | gpg … | delay curl …
curl
gpg
標準出力で印刷を開始した後にのみ実行されるか、何らかの理由で閉じられた後にのみ実行されます。
いくつかの技術的な詳細はリンクされた回答。
ifne foo
、ifne -n foo
の違いは次のとおりですdelay foo
。
ifne foo
データまたはEOFを待ってからfoo
データが利用可能になったときに実行します。ifne -n foo
データまたはEOFを待ってから、foo
データなしでiffを実行します。delay foo
データまたはEOFを待ってからfoo
無条件に実行します。