Bash脚本没有交互

时间:2012-02-09 17:59:21

标签: linux bash

我想做以下事情:

我有一个bash脚本,它调用一个交互式命令,要求用户输入密码。我想在脚本中将密码短语指定为变量,并以非交互方式将该变量传递给命令。

4 个答案:

答案 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”是变量在未指定任何值时所采用的值。