5

问题陈述

我想在不询问密码的情况下访问服务器(将在脚本中提到)并在该服务器上运行命令。

我的代码

#!/usr/bin/expect
spawn sudo su - <server_name>
expect "[sudo] password for chronicles:"
set Password "xxxxxxx"
send "$Password\r"
#set timeout 300
send "whoami\r"
send "ls -ltr\r"
expect eof

输出

invalid command name "sudo"
    while executing

限制

  • 我没有更改环境变量或修改 .bash_profile / .bashrc 的访问权限。
  • su server_name 命令不允许
4

3 回答 3

8

大卫是对的,通常这是一个主意。偶尔会有很好的理由这样做,或者做类似的事情(例如自动登录串行控制台以进行熄灯管理),但您没有提供任何说明为什么这样做对您有意义。

除了注意事项之外,invalid command name不是来自spawn生产线,而是来自[sudo]生产expect线。Expect 基于tcl它将[]方括号视为指示命令替换的特殊字符。此外,传递给的值expectglob模式而不是固定字符串,[]方括号也是 glob 中的特殊字符。所以你正在寻找的答案是引用这些字符两次

    expect "\\\[sudo\\\] password for chronicles:"

另请注意,在发送密码后,您可能应该包含另一expect行以等待 root shell 提示。

于 2012-08-20T09:57:26.947 回答
2

在不提示输入密码的情况下访问服务器的安全方法是通过 SSH 进行密钥登录。永远不要以纯文本形式提供密码。

如果你只是谷歌,你会发现很多文章解释了如何做到这一点。没有密码的 SSH 登录是一个很好的解释。

于 2012-08-20T09:15:13.370 回答
1

[]被解释TclTcl.

{}是 中最强的引用Tcl,您可以使用它来防止任何解释:

expect {[sudo] password for chronicles:}

当然你也可以省略[sudo]

expect "password for chronicles:"
于 2012-08-21T05:49:38.430 回答