无需交互的 Bash 脚本

问题描述 投票:0回答:4

我想做以下事情:

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

linux bash scripting interactive
4个回答
4
投票

我相信你会想调查一下expect。该实用程序专为代表用户打字而设计。

假设您的脚本有提示(或在需要用户交互之前可靠出现的一行),expect 可以解析输出,当它看到该行(例如“passphrase:”)时,输入您的密码并继续执行脚本.


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

1
投票

假设您的脚本是这样的(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
投票
${2:-defaultvalue}

其中 2(也可能是第一个参数)是第二个位置参数,“defaultvalue”是变量在您未指定任何值的情况下采用的值。

© www.soinside.com 2019 - 2024. All rights reserved.