Linux expect-telnet连接

Linux expect-telnet连接,linux,tcl,expect,telnet,Linux,Tcl,Expect,Telnet,我正在尝试创建一个简单的telnet连接脚本。 我生成telnet进程。根据版本的不同,它可能要求输入密码,也可能不要求输入密码 之后,它要求用户名和密码以及规则接受。成功登录后,它会提示输入命令 然而,我写的东西不起作用 #/usr/bin/expect -f set IP [lindex $argv 0] set timeout 10 set send_slow {10 .5} log_user 1 spawn telnet -l cli $IP expect { timeout

我正在尝试创建一个简单的telnet连接脚本。 我生成telnet进程。根据版本的不同,它可能要求输入密码,也可能不要求输入密码

之后,它要求用户名和密码以及规则接受。成功登录后,它会提示输入命令

然而,我写的东西不起作用

#/usr/bin/expect -f
set IP [lindex $argv 0]
set timeout 10
set send_slow {10 .5}
log_user 1

spawn telnet -l cli $IP

expect {
    timeout {
        puts "Network Connection Problem"
        close
    }
    "Password:" {
        send -s -- "cli\r"
        exp_continue
    }
    "Username:" {
        send -s -- "admin\r"
        expect "Password:"
        send -s -- "admin\r"
        exp_continue
    }
    "(Y/N)?" {
        send -s -- "Y\r"
        exp_continue
    }   
}
expect "# "
send -s -- "show version\r"
运行脚本后,我进行登录和协议。显示提示后,脚本不会执行show version命令。光标在几秒钟后闪烁我看到信息:

预期:生成id exp6未打开 执行“expect”时

有人能纠正我的错误吗?我阅读了expect手册,浏览了示例脚本,但找不到任何解决方案。我相信这很简单,但我在这里挣扎


帮帮我,船长

这里有一个声明

spawn telnet -l cli $IP
将telnet会话的用户名指定为
cli
。因此,将永远无法访问登录为
admin
的代码

admin的默认shell提示符是

'# '
cli的默认shell提示符为

'$ '

更改代码以处理查找任一shell提示符的操作。

这里有一条语句

spawn telnet -l cli $IP
将telnet会话的用户名指定为
cli
。因此,将永远无法访问登录为
admin
的代码

admin的默认shell提示符是

'# '
cli的默认shell提示符为

'$ '

更改代码以处理查找任意一个shell提示符的操作。

在expect命令中至少需要一个不执行exp\u continue的分支:“exp\u continue”:将提示符的模式作为expect命令中的最后一个模式,而不执行任何操作:当expect看到提示符时,expect命令将结束,脚本可以继续执行

expect {
    timeout {
        puts "Network Connection Problem"
        close
        exit    ;# if you don't exit, your next command is "send" which will fail
    }
    "Password:" {
        send -s -- "cli\r"
        exp_continue
    }
    "Username:" {
        send -s -- "admin\r"
        expect "Password:"
        send -s -- "admin\r"
        exp_continue
    }
    "(Y/N)?" {
        send -s -- "Y\r"
        exp_continue
    }   
    "# "
}
send -s -- "show version\r"

expect命令中至少需要一个不执行exp_continue的分支:将提示符的模式作为expect命令中的最后一个模式,而不执行任何操作:当expect看到提示符时,expect命令将结束,脚本可以继续执行

expect {
    timeout {
        puts "Network Connection Problem"
        close
        exit    ;# if you don't exit, your next command is "send" which will fail
    }
    "Password:" {
        send -s -- "cli\r"
        exp_continue
    }
    "Username:" {
        send -s -- "admin\r"
        expect "Password:"
        send -s -- "admin\r"
        exp_continue
    }
    "(Y/N)?" {
        send -s -- "Y\r"
        exp_continue
    }   
    "# "
}
send -s -- "show version\r"