执行命令后将字符串输入到命令中的 Bash 脚本

执行命令后将字符串输入到命令中的 Bash 脚本

我想编写一个脚本(使用 Bash 语言),使我可以自动登录服务 X。服务 X 将要求我输入用户名和密码,我希望我的脚本能够输入它们。代码如下:

Service X
#input username
#input password

这是我必须手动做的事情:

root@loacalhost~$ Service X  
Service X: Username:  
Service X: Password:  
You have successfully logged in to service X.  
root@loacalhost~$

以下是我想要它做的事情:

root@loacalhost~$ ./script.sh
You have successfully logged in to service X.
root@loacalhost~$ 

我该怎么做?我查看了重定向、STDIN、STDOUT 等,但我真的不明白该怎么做?我也查看了使用 echo来做这件事,但也没有成功。

答案1

问题很模糊,您的服务 X 是一个谜,我们对此一无所知。

通常,从终端读取凭证的工具不会为此使用 stdin。服务可能会或可能不会使用 stdin。它可能提供从 stdin 读取凭证的选项。它可能提供从文件读取凭证的选项。

注意:从现在开始我将使用servicex作为命令,因为X在您的命令中Service X是一个操作数,因此使用选项它应该看起来像Service -a -b --optionc X。我怀疑这种语法不是您的意图。

如果servicex默认从标准输入读取凭证,那么这应该可以工作:

printf '%s\n' "your username" "your password" | servicex

如果它仅在接到指令时才从 stdin 读取凭证,则类似于:

printf '%s\n' "your username" "your password" | servicex --credentials-from-stdin

在这两种情况下,最好从其他用户无法读取的文件中读取凭据:

<secret_file servicex --credentials-from-stdin

或者,服务可以提供从文件读取凭证的选项(将标准输入留作其他用途或不使用):

servicex --credentials-from-file secret_file

但最有可能的是,该服务直接使用终端设备来请求凭证并读取它们。在这种情况下expect是正确的工具。比较我的这个答案或者这个针对你的模糊问题的解决方案的一个模糊概述可能是:

expect -c '
 log_user 0
 spawn servicex
 expect "Service X: Username:"
 send "your username\n"
 expect "Service X: Password:"
 send "your password\n"
 interact
'

相关内容