免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13093 | 回复: 11
打印 上一主题 下一主题

关于expect程序返回值的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-08 22:39 |只看该作者 |倒序浏览
#!/bin/bash
#!/usr/local/tcl/bin       我的expect是源码编译安装,这是命令存放路径
expect -c '
spawn  ssh 192.168.0.89
expect {
    "(yes/no)?" {
        send "yes\n"
        expect "assword:"
        send "$pasword\n"
    }
        "assword:" {
        send "$password\n"
    }
}

'
问题:
如何判断红色部分的代码是否执行成功,如果expect命令的执行有返回值的话,怎么获取

论坛徽章:
0
2 [报告]
发表于 2012-05-08 23:11 |只看该作者
呵呵,我帮忙找到一个可供参考的信息:
http://stackoverflow.com/questio ... de-in-expect-script


------------------------------------
欢迎光临我的博客:www.danoking.com [DNK的博客]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2012-05-09 06:12 |只看该作者
echo $?

论坛徽章:
0
4 [报告]
发表于 2012-05-09 20:03 |只看该作者
回二楼
非常感谢你提供的例子
但是我修改代码之后发现也不能完全如愿
#!/bin/bash
#!/usr/local/tcl/bin      
expect -c '
spawn  ssh 192.168.0.89
expect {
    "(yes/no)?" {
        send "yes\n"
        expect "assword:"
        send "$pasword\n"
    }
        "assword:" {
        send "$password\n"
    }
}
expect eof
catch wait result
exit [lindex $result 3]
'
echo $?
经过测试发现
如果ssh成功 echo $?的结果压根就看不到
如果ssh失败 exit [lindex $result 3]这一段会报错,而echo $?的值居然是0

虽然例子中的
expect -c '
spawn true
expect eof
catch wait result
exit [lindex $result 3]
'
echo $?   --->0

expect -c '
spawn false
expect eof
catch wait result
exit [lindex $result 3]
'
echo $?   --->1

这段ssh的测试代码究竟应该怎么修改呢


回三楼
直接在脚本最后echo $?
不管错误还是成功  打印的都是0

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2012-05-10 08:24 |只看该作者
回复 4# lwlmj2011


    $?为0,就表示上个命令的退出状态为0,其它什么都不表示,如果你想通过$?在不同的进程间传递信息就先约定好什么$?代表什么含意

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
6 [报告]
发表于 2012-05-10 08:26 |只看该作者
另外如果条件允许,shell与expect混用就象shell perl混用一样通常是不必要的

论坛徽章:
0
7 [报告]
发表于 2012-05-10 10:57 |只看该作者
本帖最后由 roger_3301 于 2012-05-10 10:59 编辑

LZ是想判断代码是否运行成功呢?还是想获取expect的返回值呢?
如果只是判断是否成功,可以考虑再后面跟一条expect去判断。根据新的expect,再去判断后续的操作。

论坛徽章:
0
8 [报告]
发表于 2012-05-10 19:28 |只看该作者
嗯  我的初衷就是想判断上次expect执行的结果是否成功
那究竟应该怎么办呢

论坛徽章:
0
9 [报告]
发表于 2012-05-10 21:27 |只看该作者
ecpect用法

cat << EOF > /tmp/ssh_remote_test_port.exp
            set IP_ADDR   [lindex \$argv 0]
            spawn ssh \${IP_ADDR} "hostname"
            set timeout 10
            expect {
                "refused" {exit 2}
                "unreachable" {exit 2}
                "No route" {exit 2}
                "yes/no" {send "yes\n"}
                "*assword*" {send "vsyour\n"}
                timeout {exit 2}
                eof {exit 0}
            }
            expect {
                "*assword*" {send "vsyouri\n"}
                timeout         { exit 2 }
                eof             { exit 0 }
            }

            expect {
                timeout         { exit 2 }
                eof             { exit 0 }
            }

expect /tmp/ssh_remote_test_port.exp ${nextsysIP} >> ${LOG_FILE} 2>&1;
   WAIT_RET=$?

论坛徽章:
0
10 [报告]
发表于 2012-05-11 09:53 |只看该作者
楼上列的很细啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP