我想做以下事情:
我有一个bash脚本,它调用一个交互式命令,要求用户输入密码。我想在脚本中将密码短语指定为变量,并以非交互方式将该变量传递给命令。
答案 0 :(得分:3)
我相信你想调查expect。此实用程序专门为代表用户键入而设计。
假设您的脚本有一个提示(或者在需要用户交互之前可靠地显示一行),expect可以解析输出,当它看到该行时,例如'passphrase:',输入您的密码并继续执行脚本。
答案 1 :(得分:1)
这是一项非常基本的技术。为脚本提供输入文件。如果您不想修改脚本本身,这是一个不错的选择。
我必须使用我自己梦想的一个例子。这是一个提示用户输入值的基本脚本,称之为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
答案 2 :(得分:0)
让我们假设你的脚本是这个(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\" }
答案 3 :(得分:-1)
${2:-defaultvalue}
其中2(也可能是第一个参数)是第二个位置参数,“defaultvalue”是变量在未指定任何值时所采用的值。