使用expect脚本自动化telnet登录

14

我一直在尝试创建一个expect脚本,通过telnet自动登录到我的设备

如果expect命令没有多种可能性,那么脚本可以正常工作,成功登录到设备。

#!/usr/bin/expect
set timeout 20
set ip [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set password [lindex $argv 3]

spawn telnet $ip $port
expect "'^]'." sleep .1;
send "\r";
sleep .1;
expect   "login:"
send "$user\r"
expect "Password:"
send "$password\r";
interact

当我传递正确的参数时,上面的脚本可以正常工作并成功登录。但一旦我在expect命令中添加其他分支(用于错误处理),脚本就会卡在login:提示处。过一段时间后,它会打印Script Error

#!/usr/bin/expect
set timeout 20
set ip [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set password [lindex $argv 3]

spawn telnet $ip $port
expect "'^]'."
sleep .1;
send "\r";
expect
{
  "login:"
  {
        send "$user\r"
        expect "Password:"
        send "$password\r";
        interact

  }

  "host: Connection refused"
  {
    send_user "ERROR:EXITING!"
    exit
  }

}

注意:此脚本将进一步开发以等待其他提示加载不同的构建映像到设备上。仅支持 telnet(控制台)连接,因此无法使用 ssh。


1
您能分享一下您是如何在登录后传递附加命令的吗?我无法克服这个障碍:https://dev59.com/8GXWa4cB1Zd3GeqPLETh - TryTryAgain
2
如果你想通过脚本自动执行额外的 shell 命令,你应该使用 send 命令。interact 命令将控制权交给用户。从你发布的问题中,我看到你已经得到了答案。:) 期待胜利。 - woodstok
“send”命令是什么@woodstok?我看不出它如何与Telnet自动化相连接。https://wiki.tcl-lang.org/page/send - Thufir
2个回答

9

我的错误。问题出在花括号上。它们应该与expect命令处于同一行。


0

这里有一个使用expect实现telnet自动登录的脚本。我刚试过,确实有效。

#!/usr/bin/expect -f
if {[llength $argv] < 1} {
    puts "Usage: ./telnet.sh host";
    exit 1;
}
set timeout 10
set host [lindex $argv 0]
set user "my_user"
set password "my_password"
spawn telnet -l $user $host
expect {
    "?ser*" {
        send "$user\n"
        exp_continue
    }
    "?ogin*" {
        send "$user\n"
        exp_continue
    }
    "?assword*" {
        send "$password\n"
        interact
        exit 0;
    }
}
exit 1

链接: https://www.oueta.com/linux/telnet-auto-login-on-linux-and-unix-with-expect/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接