Bash 从备用文件描述符读入shell变量
我有一个程序,它会提示用户输入密码并从中派生出一个密钥,稍后我需要将该密钥通过stdin传递给解密程序。我不想在任何时候将密钥存储在文件中,因此我希望将其传递到变量中 密码程序需要显示密码提示,因此我无法在不丢失提示的情况下将其标准输出读入变量。我知道我可以从替代描述符中捕获输出,通过这种非常复杂的重定向和管道是可能的,但我无法将它们全部放在一起 密码程序是我的,所以我可以让它写入我选择的另一个描述符,比如Bash 从备用文件描述符读入shell变量,bash,shell,environment-variables,file-descriptor,io-redirection,Bash,Shell,Environment Variables,File Descriptor,Io Redirection,我有一个程序,它会提示用户输入密码并从中派生出一个密钥,稍后我需要将该密钥通过stdin传递给解密程序。我不想在任何时候将密钥存储在文件中,因此我希望将其传递到变量中 密码程序需要显示密码提示,因此我无法在不丢失提示的情况下将其标准输出读入变量。我知道我可以从替代描述符中捕获输出,通过这种非常复杂的重定向和管道是可能的,但我无法将它们全部放在一起 密码程序是我的,所以我可以让它写入我选择的另一个描述符,比如3。下面说明了我想做什么,但我知道这是不正确的。我怎样才能解决这个问题 read key
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
应该像shouldread key@william:这就是从shell的fd3读取read
的方法。但是,你打算如何使密码程序的输出显示在shell的fd3上呢?很明显,password\u程序
是如何写入自己的FD3的,但这没有多大帮助。read-u3
应该像shouldread key@william:这就是如何从shell的FD3读取read
。但是,你打算如何使密码程序的输出显示在shell的fd3上呢?很明显,password\u程序
如何写入自己的FD3,但这并没有多大帮助。谢谢。在这种情况下,您建议将提示符写入stderr和stdout的键确实有效,因此我将对此进行投票,但我仍然希望有人能告诉我如何使用替代文件描述符来实现这一点,以获得更通用的解决方案。IFS=read-srp”提示符:“passwd
方法对我不起作用,因为我的密码程序必须执行额外的处理才能导出密钥。谢谢。在这种情况下,您建议将提示符写入stderr和stdout的键确实有效,因此我将对此进行投票,但我仍然希望有人能告诉我如何使用替代文件描述符来实现这一点,以获得更通用的解决方案。IFS=read-srp”提示符:“passwd
方法对我不起作用,因为我的密码程序必须执行额外的处理才能导出密钥。