linux下expect脚本问题

请教大家
我想实现一个功能,用expect远程登陆设备后开始进行ping测试,一旦出现timeout便执行exit,如果没有timeout就等ping完成后执行exit。请问用expect如何实现。
其实就是当我在执行一个命令后,系统会有输出,在输出过程中对内容进行判断,匹配到一个关键字后执行一个命令,若输出过程中无此关键字,则该判断语句也不会生效,进行下一条命令。不知道这样描述大家是否能明白。
谢谢
或者具体点,我想执行ping 1.1.1.1(100个包),如果中间无timeout,那执行exit,如果中间出现了timeout则插入一个中断命令,再执行exit。

#!/usr/bin/expect -f

if { $argc != 1 } {
    puts "usage: $argv0 IP"
    exit 1
} else {
    set IP [lindex $argv 0]
}

set pingcmd [format "ping -c 100 %s " $IP]

set timeout 6000

# 比如远程用户叫做test
set destuser test
# 比如远程服务器IP为如下
set destip 192.168.0.123
set destpath "$destuser@$destip"
# 比如用户密码叫做test
set destpassword test

# ssh登录
spawn ssh $destpath 

#######################
expect {
-re ".*yes/no.*" {
    exp_send "yes\r"
    exp_continue
    }
-re ".*assword.*" {
    exp_send "$destpassword\r"
    }
}

# 比如ssh登录以后的提示符是 test@Testserver > 
expect {
-re ".*test@Testserver.*" {
    exp_send "$pingcmd\r"
    }
}

expect {
# 如果输出timeout字符,则Control+C结束pingcmd
# 这里用的是Destination Host Unreachabl替换time out。因为本人机器上没有time out.
-re ".*Destination Host Unreachabl.*" {
    # 输入Control+c
    exp_send "\003"

    # Control+c后必然输出登录提示符,再输入期望执行的命令
    expect {
        -re ".*test@Testserver.*" {
            # 假设希望执行的命令是ls
            exp_send "ls\r"
            }
        }

    # 执行完ls之后退出
    expect {
        -re ".*test@Testserver.*" {
            exp_send "exit\r"
            }
        }
    }

# 如果没有输出timeout字符, 退出。
-re ".*test@Testserver.*" {
    exp_send "exit\r"
    }
}

interact

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网