我想编写一个脚本(使用 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
'