从进程替换中安全地读取密码?

从进程替换中安全地读取密码?

有关的:

我已阅读上述问题,但仍然不知道如何做我需要的事情。

我有一个二进制命令,我将调用getreport该命令执行以下操作:

  1. 提示输入密码(提示发送到 stderr)
  2. 从标准输入读取密码。
  3. 将大量数据打印到标准输出。

我有另一个二进制命令来解析我将调用的第一个命令的输出processreport。但是,它不适用于 stdin;它只会接受并处理在命令行上使用-i标志指定的文件。它从文件中读取,使用读入的数据执行操作,并输出有关其操作的数据。 (该processreport命令可以提示输入密码,完全独立于getreport。)

我想使用进程替换在一行中实现这一点,而不是需要一个临时文件来保存getreport.

就像是:

processreport -i <(getreport)

但是,我不知道如何getreport读取从航站楼它需要的密码。

这可能吗?

答案1

{ getreport | 4<&0 <&3 processreport -i /dev/fd/4; } 3<&0

如果您愿意始终明确地阅读/dev/tty

getreport | 3<&0 </dev/tty processreport -i /dev/fd/3

...或者更简单地说,如果您知道 stderr 将始终等于 stdin - 正如它通常在终端中所做的那样...

getreport | 3<&0 <&2 processreport -i /dev/fd/3

答案2

getreport无法从终端读取,因为它是后台进程。

man 2 read:

EIO:输入/输出错误。
例如,当进程位于后台进程组中,尝试从其控制终端读取数据,并且忽略或阻止 SIGTTIN 或其进程组被孤立时,就会发生这种情况。

我想,如果没有一些外壳包装,你想要的东西是不可能实现的。但也许这更接近你想要的:

mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
cat <(read bginput <fifo; echo "$bginput"); rm fifo

这显然不适用于错误密码和读取重试。

mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
processreport -i <(getreport <fifo); rm fifo

相关内容