我正在尝试在Debian中自动化telnet会话,但在发送命令时我遇到了困难。
通过查看here,我对我需要做的事情有了很好的理解。
spawn telnet localhost
expect "login:"
send "test\n"
expect "Password:"
send "password\n"
sleep 10 //Time for the connection to be established
send "ls\n"
运行脚本,它正确地输入了用户名。它到达了密码字段,我假设它已输入(虽然我无法确定,因为密码在输入时在Debian中保留为空白)。它因等待而停滞不前,然后把我带回了我的帐户(root)。它没有连接到" test"。
修改我的代码更像我的参考:
spawn telnet localhost
expect "login:"
send "test\n"
expect "Password:"
send "password\n"
interact
这导致它立即登录并连接到我的" test"帐户。 从这里开始,我尝试使用send,echo和只需键入命令进行交互后添加命令。在我退出telnet会话之前什么都不会发生,然后我会得到这个错误。
发送:
send: spawn id exp6 not open
while executing
"send "ls\n""
(file ".telnet.sh" line 8)
对于echo:
invalid command name "echo"
while executing
"echo "ls\n""
(file ".telnet.sh" line 8)
只需命令名称" ls" 命令名称无效" ls" 执行时 " LS" (文件" .telnet.sh"第8行)
我意识到互动会将控制权交还给用户,但由于某种原因,这是实际让我连接到帐户的唯一方式。
有没有人知道为什么没有互动时连接有问题?如果没有,为什么我不能发送这些命令,直到telnet会话以interaction结束?
修改 经过一些研究后,我发现了这个link,最终得出一个结果,即一切结束后,expect脚本会立即结束,关闭telnet会话。他们说他们通过添加期望" $"来解决这个问题。让脚本知道更多的命令正在发送它的方式。我试过使用' $'像网站建议的符号,但它结束了再次踢我。所以我尝试了这个。
这是我更新的代码:
#!/usr/bin/expect
spawn telnet localhost
expect "debian login"
send "test\n"
expect "Password:"
send "password\n"
expect "test@debian:~$"
send "ls\n"
现在我仍然在telnet会话中大约10秒钟,然后它就把我踢了。如果我在那段时间尝试输入命令,它会暂停一段时间,然后运行我在telnet会话关闭后键入的命令。
正在取得进展。慢慢但肯定。
答案 0 :(得分:1)
我通过在发送命令后再次期待bash来解决这个问题。
当像这样跑:
send "password\r"
expect "*$*"
send "ls\r"
telnet会话立即结束。最终工作的是期望再次启动bash脚本。因为脚本在发送最后一个命令后结束,所以它没有机会显示输入的命令的结果。
我通过添加额外的期望来解决这个问题,然后允许我的命令处理并获得结果。
这是我的最终代码。
#!/usr/bin/expect
spawn telnet localhost
set timeout 10
expect "debian login"
send "test\r"
expect "Password:"
send "password\r"
expect "*$*"
send "ls\n"
expect "*$*"
send "command2"
expect "*$*"
send "command3"
expect "*$*"
send "exit\r"
答案 1 :(得分:0)
问题可能是因为您在预期终端之前发送了ls命令, 代码期望" * $ *"在输入密码后期望终端,并且正则表达式(* $ *)可能因telnet会话的PS1环境变量而异,下面是列出当前工作目录的内容并注销的代码
spawn telnet localhost
set timeout 10
expect "debian login"
send "test\r"
expect "Password:"
send "password\r"
expect "*$*"
send "ls\r"
expect "*$*"
send "logout\r"