Bash 从备用文件描述符读入shell变量

Bash 从备用文件描述符读入shell变量,bash,shell,environment-variables,file-descriptor,io-redirection,Bash,Shell,Environment Variables,File Descriptor,Io Redirection,我有一个程序,它会提示用户输入密码并从中派生出一个密钥,稍后我需要将该密钥通过stdin传递给解密程序。我不想在任何时候将密钥存储在文件中,因此我希望将其传递到变量中 密码程序需要显示密码提示,因此我无法在不丢失提示的情况下将其标准输出读入变量。我知道我可以从替代描述符中捕获输出,通过这种非常复杂的重定向和管道是可能的,但我无法将它们全部放在一起 密码程序是我的,所以我可以让它写入我选择的另一个描述符,比如3。下面说明了我想做什么,但我知道这是不正确的。我怎样才能解决这个问题 read key

我有一个程序,它会提示用户输入密码并从中派生出一个密钥,稍后我需要将该密钥通过stdin传递给解密程序。我不想在任何时候将密钥存储在文件中,因此我希望将其传递到变量中

密码程序需要显示密码提示,因此我无法在不丢失提示的情况下将其标准输出读入变量。我知道我可以从替代描述符中捕获输出,通过这种非常复杂的重定向和管道是可能的,但我无法将它们全部放在一起

密码程序是我的,所以我可以让它写入我选择的另一个描述符,比如
3
。下面说明了我想做什么,但我知道这是不正确的。我怎样才能解决这个问题

read key < <&3 $(password_program) 
# other operations ...
echo $key | decryption_program -

readkey<如果您正在编写密码程序,最简单(也是最常见的)解决方案是将提示写入
stderr
,让
stdout
免费。因此,您可以将密码回显到
stdout
,并将其捕获到变量中

或者,您可以编写提示并从
/dev/tty
读取密码


对于最简单的解决方案,如果您使用的是bash,而您的密码读取器所做的只是打印提示并读取密码,而不回显它,那么您可以只使用
IFS=read-srp”提示:“passwd

如果您正在编写密码程序,最简单(也是常见的)的解决方案是将提示写入
stderr
,让
stdout
免费。因此,您可以将密码回显到
stdout
,并将其捕获到变量中

或者,您可以编写提示并从
/dev/tty
读取密码


对于最简单的解决方案,如果您使用的是bash,而您的密码读取器所做的只是打印一个提示并读取密码,而不回显它,那么您可以使用
IFS=read-srp”提示:“passwd

我认为,这应该可以在bash中实现您的技巧:

exec 4>&1
key=$(password_program 3>&1 >&4-)
exec 4>&-
它的工作原理如下:第一个exec将文件描述符1(
stdout
)复制为描述符4。然后,由于
$()
语法,在子shell中执行
password\u程序
,其
stdout
将进入变量
key
。但在实际执行
password\u程序
之前,我们让该子shell执行一些描述符损坏:描述符3作为描述符1的副本打开,以便
password\u程序
可以将其结果写入描述符3。然后将描述符4(我们保存的原始标准输出的“副本”)移动到描述符1。因此,结果是:
password\u程序
将以其
stdout
作为启动shell的相同文件(或tty等)运行。最后一个命令再次删除主shell中的描述符4

如果您可以克隆stderr而不是stdout作为
密码\u程序的输入,您还可以执行以下操作:

key=$(password_program 3>&1 >&2)

我想,这应该可以让你在bash中发挥作用:

exec 4>&1
key=$(password_program 3>&1 >&4-)
exec 4>&-
它的工作原理如下:第一个exec将文件描述符1(
stdout
)复制为描述符4。然后,由于
$()
语法,在子shell中执行
password\u程序
,其
stdout
将进入变量
key
。但在实际执行
password\u程序
之前,我们让该子shell执行一些描述符损坏:描述符3作为描述符1的副本打开,以便
password\u程序
可以将其结果写入描述符3。然后将描述符4(我们保存的原始标准输出的“副本”)移动到描述符1。因此,结果是:
password\u程序
将以其
stdout
作为启动shell的相同文件(或tty等)运行。最后一个命令再次删除主shell中的描述符4

如果您可以克隆stderr而不是stdout作为
密码\u程序的输入,您还可以执行以下操作:

key=$(password_program 3>&1 >&2)

read-u3
应该像should
read key@william:这就是从shell的fd3读取
read
的方法。但是,你打算如何使密码程序的输出显示在shell的fd3上呢?很明显,
password\u程序
是如何写入自己的FD3的,但这没有多大帮助。
read-u3
应该像should
read key@william:这就是如何从shell的FD3读取
read
。但是,你打算如何使密码程序的输出显示在shell的fd3上呢?很明显,
password\u程序
如何写入自己的FD3,但这并没有多大帮助。谢谢。在这种情况下,您建议将提示符写入stderr和stdout的键确实有效,因此我将对此进行投票,但我仍然希望有人能告诉我如何使用替代文件描述符来实现这一点,以获得更通用的解决方案。
IFS=read-srp”提示符:“passwd
方法对我不起作用,因为我的密码程序必须执行额外的处理才能导出密钥。谢谢。在这种情况下,您建议将提示符写入stderr和stdout的键确实有效,因此我将对此进行投票,但我仍然希望有人能告诉我如何使用替代文件描述符来实现这一点,以获得更通用的解决方案。
IFS=read-srp”提示符:“passwd
方法对我不起作用,因为我的密码程序必须执行额外的处理才能导出密钥。