期望从文件中读取脚本问题

Expect Scripting Issue Reading From File

我正在尝试更改一组基于 linux 的路由器上的用户密码,这些路由器从列表中提取 IP。 iplist.txt 只是一个 ips 列表(每行一个)。这是我尝试使用的代码:

#!/usr/bin/expect
set timeout 20
#Edit for User
set user username
#Edit for Old Password
set old oldpassword
#Edit for New Password
set new newpassword
#get IP List from iplist.txt
set f [open "/iplist.txt"]
set hosts [split [read $f] "\n"]
close $f

foreach host $hosts {
        spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$host
        expect "assword:"
        send "$old\r"
        expect ">"
        send "user set $user password=$new\r"
        expect ">"
        send "quit\r"
        expect eof
        close
}

这适用于列表中的第一个 ip,但在第二个 ip 上发送此错误:

spawn_id: spawn id exp4 not open

我让它按照我想要的方式工作:

    #!/usr/bin/expect
    set timeout 30
    #Edit for User
    set user user
    #Edit for Old Password
    set old oldpassword
    #Edit for New Password
    set new newpassword
    #get IP List from iplist.txt
    set f [open "/iplist.txt"]
    set data [read $f]
    close $f

    foreach line [split $data \n] {
            if {$line eq {}} continue
            spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$line
            expect "assword:"
            send "$old\r"
            expect ">"
            send "user set $user password=$new\r"
            expect ">"
            send "\r"
            expect ">"
            send "quit\r"
            send "\r"
            expect eof
    }

我 运行 遇到的下一个问题是,如果设备没有旧密码,或者如果 linux 框无法通过 ssh 访问设备,它会因相同的生成而出错id exp* 在到达该 IP 时未打开,并且不会继续到列表中的下一个 IP。无论如何我可以声明如果 "assword:" 第二次出现以移动到下一个 IP 并且如果“>”出现就像它应该继续执行脚本一样,然后在 spawn 命令之后添加一行如果没有收到第一个 expect "assword:"?

,它将移动到列表中的下一个 IP

如有任何帮助,我们将不胜感激。我是新手,但似乎是一个非常好的工具,可以在脚本中进行大量 ssh 进程。只是无法将其调整为不会在 1 个作业上出错,而​​不是在出错时转移到下一个作业。

    #!/usr/bin/expect
    set timeout 30
    #Edit for User
    set user user
    #Edit for Old Password
    set old oldpassword
    #Edit for New Password
    set new newpassword
    #get IP List from iplist.txt
    set f [open "/iplist.txt"]
    set data [read $f]
    close $f

    foreach line [split $data \n] {
            if {$line eq {}} continue
            spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$line
            expect {
                    "assword:" {
                            send "$old\r"
                            expect {
                                    "assword:" {
                                                    close
                                                    continue
                                                    }}
                            expect {
                                    "*" {
                                            send "user set $user password=$new\r"
                                            expect ">"
                                            send "quit\r"
                                            close
                                            continue
                                            }}}}
            expect {
                    "*" {
                            close
                            continue
                            }}
            expect eof
    }

可能有点脏脚本,但它有效。现在,如果我能弄清楚如何导出成功、错误的密码和超时日志,那么我就知道是否有任何错误。