如何自动应答多阶段命令?

如何自动应答多阶段命令?

我是 Ubuntu 终端的新手。我有一个连接到 VPN 服务器的命令。第一步我必须输入sudo vpn_命令所以我必须输入 root 密码,然后在下一步中我必须分别输入“是”和 vpn 用户名和 vpn 密码。

我想用一个命令完成所有这些操作。你能帮助我吗?

答案1

这是可能的。尽管如评论中所述,这可能不是最好的主意。请注意,您必须使用自己的 sudo 密码,而不是 root 的密码(这正是运行 sudo 的目的)。最好将 sudo 配置为不询问密码。此外,您的 vpn 可能有一个采用凭据文件名的选项。

您需要的程序名为 expect。首先sudo apt-get install expect。Expect,顾名思义,期望终端上的字符串并返回其他字符串。当程序提示答案时,它是完美的工具。这是一个相当复杂的程序,但在这里,它可以以非常基本的方式使用:

  1. 运行 sudo 命令并在终端上监视输出
  2. 当你看到此字符串时,发送此答案
  3. 当你看到另一个字符串时,发送另一个答案
  4. ETC...

askubuntu 问题 307067或者stackoverflow 问题 38458053例如。一旦您知道必须询问“预期密码示例”,您的搜索引擎就会找到许多示例。

sudo 不会总是要求您输入密码。如果您在 5 分钟左右的时间内在同一终端中重新运行 sudo 命令,它不会再次要求输入密码。在这种情况下,您可以使用 expect timeout。

您可以编写一个名为 myexpectscript 的脚本,其内容如下:

#!/usr/bin/expect -d
set timeout 5

set pw {YOUR ubuntu GNU/linux P4ßw0rd}
set vpnuser {yourvpnusername}
set vpnpass {vpn-PAs$w0rd}
spawn sudo -p sudoisaskingforyourpassword vpncommand -foo -b ar etc...

expect "sudoisaskingforyourpassword" { send "$pw\n" }
expect {Do you really want to do that} { send "Yes\n" }
expect {vpn user prompt} { send "$vpnuser\n" }
expect {vpn password prompt} { send "$vpnpass\n" }
interact

使用 使其可执行chmod 700 myexpectscript,然后运行./myexpectscript​​。更改-d-f以摆脱调试输出。您必须调整超时、命令和各种提示和密码。

当然,所有这些都没有经过完全测试。

最后但同样重要的一点是:expect 使用TCL语言。TCL 是一种非常优雅和友好的语言,只是对朋友有点挑剔。如果遇到错误,请准备好阅读很长时间的文档。

相关内容