我想做以下事情:
我有一个 bash 脚本,它调用一个交互式命令,要求用户输入密码。我想将脚本中的密码指定为变量,并以非交互方式将该变量传递给命令。
我相信你会想调查一下expect。该实用程序专为代表用户打字而设计。
假设您的脚本有提示(或在需要用户交互之前可靠出现的一行),expect 可以解析输出,当它看到该行(例如“passphrase:”)时,输入您的密码并继续执行脚本.
这是一个非常基本的技术。为脚本提供输入文件。如果您不想修改脚本本身,这是一个不错的选择。
我必须用一个我自己想象的例子。这是一个提示用户输入值的基本脚本,称之为
scp
:
#!/bin/bash
echo -n "Type something: "
read X
echo You gave: $X
echo -n "Type something again: "
read Z
echo This time gave: $Z
您可以提供一个这样的输入文件,称之为
input
:
value for X
value for Z
然后要调用提供
input
作为脚本输入的脚本,请执行以下操作:
cat input | ./scp
..或者简洁地:
./scp < input
输出如下所示:
Type something: You gave: value for X
Type something again: This time gave: value for Z
假设您的脚本是这样的(genrsa.sh):
#!/bin/sh
ssh-keygen -t rsa
通常,如果您执行 genrsa.sh 文件,它会要求输入文件名和密码两次。像这样:
$./genrsa.sh
Enter file name (/root/.ssh/id_rsa):
Enter passphrase(empty for no passphrase:mypassword
Enter same passphrase:mypassword
public key generated, bla bla bla...
$
您想要以某种方式更改脚本,以便可以将密码作为参数传递。所以它不会等待您输入。你会这样使用它:
$./genrsa.sh mypassword
为此,您必须将脚本更改为类似的内容(genrsa2.sh):
#!/bin/sh
passphrase=$1
set timeout 2
ssh-keygen -t rsa
expect \"Enter file\" { send \"\r\" }
expect \"empty for\" { send \"$passphrase\r\" }
expect \"same passphrase\" { send \"$passphrase\r\" }
${2:-defaultvalue}
其中 2(也可能是第一个参数)是第二个位置参数,“defaultvalue”是变量在您未指定任何值的情况下采用的值。