6

どうやってパイプを作るのかしら

program 1 | ... | program N

複数のプログラムがユーザー入力を要求する場合。問題は|、プログラムを並行して起動するため、端末から並行して読み取りを開始することです。

このような場合|、プログラムiが何らかの出力を生成した後にのみ、プログラム(i + 1)を開始するパイプがあると便利です。

編集:

例:

cat /dev/sda | bzip2 | gpg -c | ssh user@host 'cat > backup'

ここでは、パスワードを要求するgpg -cだけでなく。ssh

この特定の例の回避策は、sshキーペアの作成ですが、これはすべてのシステムで可能であるとは限らず、一般的な解決策があるかどうか疑問に思いました。また、gpgでは、パスフレーズをコマンドライン引数として渡すことができますが、セキュリティ上の理由から、これはお勧めしません。

4

4 に答える 4

1

私は今使用しています:

#!/bin/bash
sudo echo "I am root!"
sudo cat /dev/disk0 | bzip2 | gpg -c | (read -n 1 a; (echo -n "$a"; cat) | ssh user@host 'cat > backup')

1 つ目sudoは、2 つ目がパスワードを再度要求するのを防ぎます。上で提案したように、readは ssh の開始を延期します。改行を待ちたくないので for と-n 1、改行を抑制するためにforを使いました。read-necho

于 2012-08-03T09:47:51.883 に答える
1

この構造を使用できます。

(read a; echo "$a"; cat) > file

例えば:

$ (read a; echo "$a"; echo cat is started > /dev/stderr; cat) > file
1
cat is started
2
3

ここで1は、23がキーボードから入力されました。cat is startedエコーによって書かれました。

fileコマンド実行後の内容:

$ cat file
1
2
3
于 2012-08-03T08:20:42.583 に答える
0

1つは、オプションを使用してgpgにパスワードを指定--passphraseできます。

sshの場合、最善の解決策はキーでログインすることです。ただし、パスワードで行う必要がある場合は、expectコマンドが適切です。良い例を次に示します。bashスクリプトでexpectを使用して、SSHコマンドにパスワードを提供します。

また、Expectを使用すると、入力を行うことができます。したがって、パスワードをハードコーディングしたくない場合は、これが最適な方法である可能性があります。

于 2012-08-03T08:29:51.683 に答える
0

パイプラインの最初のコマンドでパスワードを入力する必要があり、次のコマンドではこれに自動的に対応しない (そのようにless) という、似たようなものが数回前に必要でした。

Igor の回答と同様に、サブシェル内で read を使用すると便利です。

cmd1 | ( read; cat - | cmd2 )
于 2012-11-02T00:24:17.247 に答える