问题陈述
我想访问服务器而不询问密码(将在脚本中提及)并在该服务器上运行命令。
我的代码
#!/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
限制
答案 0 :(得分:8)
大卫是对的,通常这是一个糟糕的想法。有偶尔做这件事的好理由,或做类似的事情(例如自动登录串口控制台进行熄灯管理),但是你没有提供任何关于为什么它对你有意义的指示这样做。
除了警告之外,invalid command name
并非来自spawn
行,而是来自[sudo]
行中的expect
。期望基于tcl
,treats []
square parentheses as special characters indicating command substitution。此外,传递给expect
的值是 glob 模式而不是固定字符串,[]
方括号也是globs中的特殊字符。所以你要找的答案是引用那些字符两次:
expect "\\\[sudo\\\] password for chronicles:"
另请注意,在发送密码后,您可能应该包含另一个expect
行以等待root shell提示。
答案 1 :(得分:2)
在不提示输入密码的情况下访问服务器的安全方法是通过SSH上的键控登录。 请勿以纯文本形式提供密码。
如果你只是谷歌,你会发现很多文章解释如何做到这一点。 SSH login without password是一个非常好的解释。
答案 2 :(得分:1)
[]
在Tcl
中被解释为“命令引号”(“工具命令语言”中的“命令”,这是Tcl
的缩写)。
{}
是Tcl
中最强的引语,您可以使用它来阻止任何解释:
expect {[sudo] password for chronicles:}
当然你也可以省略[sudo]
:
expect "password for chronicles:"