问题陈述
我想访问服务器而不问我密码(将在脚本中提到)并在该服务器上运行命令.
我的守则
#!/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
Run Code Online (Sandbox Code Playgroud)
产量
invalid command name "sudo"
while executing
Run Code Online (Sandbox Code Playgroud)
限制
大卫是对的,通常这是一个坏主意.这种情况偶尔有充分的理由,或做类似的事情(例如自动登录到串行控制台进行熄灯管理),但是你没有提供任何关于为什么你这样做有意义的指示.
注意事项不谈,invalid command name是不是从未来的spawn线,但来自[sudo]于expect行.Expect基于tcl,将[]方括号视为表示命令替换的特殊字符.另外,传递给的值expect是glob模式而不是固定字符串,[]方括号也是globs中的特殊字符.所以你要找的答案是两次引用这些字符:
expect "\\\[sudo\\\] password for chronicles:"
Run Code Online (Sandbox Code Playgroud)
另请注意,在发送密码后,您可能应该包含另一expect行以等待root shell提示.