6

我想知道如何创建管道

program 1 | ... | program N

其中多个程序要求用户输入。问题是|并行启动程序,因此它们开始从终端并行读取。

|对于这种情况,只有在程序 i 产生了一些输出之后才启动程序 (i+1)的管道会很有用。

编辑:

例子:

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

在这里既要输入密码,也要输入密码gpg -cssh

此特定示例的解决方法是创建 ssh 密钥对,但这并非在每个系统上都可行,我想知道是否有通用解决方案。gpg 还允许将密码短语作为命令行参数传递,但出于安全原因不建议这样做。

4

4 回答 4

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

在这里123是从键盘输入的;cat is started是由回声写的。

file命令执行后的内容:

$ cat file
1
2
3
于 2012-08-03T08:20:42.583 回答
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')

第一个sudo将阻止第二个再次询问密码。如上所述,read推迟了 ssh 的启动。因为我不想等待换行符,所以我使用-n 1了for来抑制换行符。read-necho

于 2012-08-03T09:47:51.883 回答
0

对于一个,您可以使用该--passphrase选项为 gpg 提供密码。

对于 ssh,最好的解决方案是按键登录。但是,如果您需要通过密码进行操作,则该expect命令会很好。这是一个很好的例子:在 bash 脚本中使用 expect 来为 SSH 命令提供密码

Expect 还允许您进行一些输入 - 因此,如果您不想硬编码您的密码,这可能是要走的路。

于 2012-08-03T08:29:51.683 回答
0

我以前需要类似的东西几次,管道中的第一个命令需要输入密码,而下一个命令不会自动满足这个要求(就像less那样)。

与 Igor 的回复类似,我发现在子shell 中使用 read 很有用:

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