SSHを介してリモートGPGインストールを使用してローカルファイルを暗号化して署名しようとしています。
pv file | ssh -tt [ssh server] gpg -se -r [receipt key] > file.gpg
ダブル使用ティーオプションはgpg "cannot open '/dev/tty': No such device or address"
エラーを除去します。ただし、gpgへの入力として送信されるのではなく、暗号化されたコンテンツはsshパスワードプロンプトの直後に印刷されます。その後、入力は閉じられてgpgで停止し、署名のために秘密鍵のロックを解除するためのパスワードを要求します(またはファイルが大きすぎる場合はSSH接続を閉じます)。
SSHを介して実行される対話型コマンドの入力にデータを渡す正しい方法は何ですか?
答え1
ssh
(あなたがしたように)にデータを転送するはいこれは、SSHを介して実行されるコマンドに入力データを渡す正しい方法です。
ここで問題はgpg
必要性です二つ読み取る入力ストリーム:
- 暗号化するデータを読み取るもの(STDIN)、
- パスワードを読むための別の(対話型端末
/dev/tty
)(これが-t
オプションを渡す理由ですssh
)。
2つを組み合わせて2つの目的でSTDINを使用する場合は、両方の入力を分離するためにEOF信号を送信する方法が必要です。ただし、ssh
ファイルの終わりも読み取られ、渡された入力ストリームは閉じられます。
私が考えることができる唯一の実用的な解決策は、データをファイルに保存して使用することですgpg
(必須二つ別々に呼び出されますssh
)::
pv file | ssh ... '(umask 077; cat > file.unencrypted)'
ssh -t ... 'gpg -se -r ... < file.unecrypted > file.gpg; rm -f file.unencrypted'