我正在尝试编写一个 Expect 脚本,该脚本将 ssh 进入服务器,发送 sudo su,然后检查 iptables 状态并将输出放入服务器上的日志文件中。下面是脚本。
1 #!/usr/bin/expect
2 exp_internal 1
3 log_user 0
4 set timeout 10
5 set password "******"
6
7 spawn /usr/bin/ssh -l subhasish *.*.*.* -p 10022
8
9 expect {
10 -re "password: " {send "$password\r"}
11 -re "$ " {send "sudo su\r"}
12 -re "[sudo] password for subhasish:" {send "$password\r"}
13 -re "# " {send "service iptables status\r"}
14 }
15 set output $expect_out(buffer)
16 send "exit\r"
17 puts "$output\r\n" >> output.log
但是在调试模式下运行时,我收到这样的错误;
expect -d testcase
expect version 5.44.1.15
argv[0] = expect argv[1] = -d argv[2] = testcase
set argc 0
set argv0 "testcase"
set argv ""
executing commands from command file testcase
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {24105}
invalid command name "sudo"
while executing
"sudo"
invoked from within
"expect {
-re "password: " {send "$password\r"}
-re "$ " {send "sudo su\r"}
-re "[sudo] password for subhasish:" {send "$password\r"}
..."
(file "testcase" line 9)
不知道我哪里出错了。它说无效的命令名称“sudo”,我想这是因为expect不理解这些命令。如何绕过它。请帮忙。谢谢。
问题出在这一行
-re "[sudo] password for subhasish:" {send "$password\r"}
在 Tcl 中(因此在 Expect 中),方括号是命令替换的语法(就像 shell 中的反引号)。因此,您要么需要转义括号,要么使用不同的引号来防止各种扩展:
-re {[sudo] password for subhasish:} {send "$password\r"}
这就带来了一个不同的问题:你期待看到这些确切的角色吗?因为您指示 Expect 将其视为正则表达式,并且正则表达式中的方括号表示字符类,所以它将匹配单个字符,即“s”、“u”、“d”或“o” '。所以你可能需要的是这样的:
-re {\[sudo\] password for subhasish:} {send "$password\r"}
or
-ex {[sudo] password for subhasish:} {send "$password\r"}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)