免费注册 查看新帖 |

Chinaunix

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

[文本处理] expect问题求助 [复制链接]

论坛徽章:
1
19周年集字徽章-19
日期:2019-08-22 08:47:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2019-08-20 16:04 |显示全部楼层 |倒序浏览
本帖最后由 mychnunixwebsite 于 2019-08-20 17:26 编辑


    使用expect遇到一些问题,登陆目标主机后,间隔两秒执行send "echo $(date "+%Y-%m-%d %H:%M:%S")\r",按理说延迟2秒后执行的时间应该多2了秒,但显示出来时间是一样的,请教一下这个问题要怎么解决呢?
    如果间隔两秒执行 send "date \"+%Y-%m-%d %H:%M:%S\"\r" 后执行的命令显示的时间是正常的,比先执行命令的时间多2秒。

执行结果截图:


代码:

/usr/bin/expect>>log/log.log 2>&1<<EOF

    set timeout 5
    spawn ssh $3@$1 -p $2
    sleep 3

    send "$4\r"
    sleep 1

    send "su $5\r"
    sleep 1

    send "$6\r"
    sleep 1

    send "echo $(date "+%Y-%m-%d %H:%M:%S")\r"
    sleep 2

    send "echo $(date "+%Y-%m-%d %H:%M:%S")\r"
    sleep 2

    send "date \"+%Y-%m-%d %H:%M:%S\"\r"
    sleep 2

    send "date \"+%Y-%m-%d %H:%M:%S\"\r"
    sleep 2

    send "exit\r"
    send "exit\r"

expect eof
EOF



jt.jpg (25.48 KB, 下载次数: 137)

jt.jpg

论坛徽章:
1
19周年集字徽章-19
日期:2019-08-22 08:47:17
2 [报告]
发表于 2019-08-20 17:35 |显示全部楼层
回复 2# jzsjm1002

谢谢解答,我主要的疑问是怎样才能让变量的值改变?还有个问题就是,我需要使用send执行sed操作,把1.txt文档中test123的行前插入#号,正常情况下执行两遍操作后文档中的test123行前都会有#号,但实际情况是第一行有两个#号,第二行没有#号,还是变量的值不能改变的问题,这个问题要怎么解决呢?

操作:
send "sed -i ''$(cat -n 1.txt|grep -v "\#"|grep 'test123'|sed -n 1p|awk '{print $1}')'s/^/\#&/g' 1.txt\r"
send "sed -i ''$(cat -n 1.txt|grep -v "\#"|grep 'test123'|sed -n 1p|awk '{print $1}')'s/^/\#&/g' 1.txt\r"


1.txt文件内容:
test123
test123

2.执行后文件内容:
##test123
test123




3.想要达到的效果:
#test123
#test123



论坛徽章:
1
19周年集字徽章-19
日期:2019-08-22 08:47:17
3 [报告]
发表于 2019-08-20 17:55 |显示全部楼层
回复 4# jzsjm1002

谢谢解答,但还是想搞清楚,变量不能更新的原因,您了解是什么原因吗?

论坛徽章:
1
19周年集字徽章-19
日期:2019-08-22 08:47:17
4 [报告]
发表于 2019-08-21 17:35 |显示全部楼层
回复 6# jzsjm1002
    不好意思,昨天系统限制要添加8个好友才能继续发言,刚刚添加够8个好友。    直接执行是正常的,但是如果通过expect send发送,变量的值就不正常了,第二个变量的值跟第一个变量的值是一样的。


论坛徽章:
1
19周年集字徽章-19
日期:2019-08-22 08:47:17
5 [报告]
发表于 2019-08-26 16:16 |显示全部楼层
本帖最后由 mychnunixwebsite 于 2019-08-26 16:36 编辑

找到原因了,还是转义的问题。
    如果按照例1中的代码执行,send发送的是变量值(环境是shell脚本里嵌入expect),不是双引号中间的字符串,所以看到的结果是变量的值是一样的。
    按照例2中的代码执行,send发送的是字符串,字符窜在目标服务器上执行,得到了预期的结果。
例1:
    send "echo $(date "+%Y-%m-%d %H:%M:%S")\r"
    sleep 2
    send "echo $(date "+%Y-%m-%d %H:%M:%S")\r"

例2:
    send "echo \\\$(date \"+%Y-%m-%d %H:%M:%S\")\r"
    sleep 2
    send "echo \\\$(date \"+%Y-%m-%d %H:%M:%S\")\r"

完整代码:
#!/bin/bash

echo 'go'

echo 'run expect'

/usr/bin/expect>>log/log.log 2>&1<<EOF

    set timeout 5
    spawn ssh $3@$1 -p $2
    sleep 3

    send "$4\r"
    sleep 1

    send "su $5\r"
    sleep 1

    send "$6\r"
    sleep 1

    #send发送的是变量值
    send "echo $(date "+%Y-%m-%d %H:%M:%S")\r"
    sleep 2
    send "echo $(date "+%Y-%m-%d %H:%M:%S")\r"
    sleep 2

    #send发送的是字符串
    send "echo \\\$(date \"+%Y-%m-%d %H:%M:%S\")\r"
    sleep 2
    send "echo \\\$(date \"+%Y-%m-%d %H:%M:%S\")\r"
    sleep 2

    send "exit\r"

expect eof
EOF


echo 'over'



论坛徽章:
1
19周年集字徽章-19
日期:2019-08-22 08:47:17
6 [报告]
发表于 2019-08-27 08:52 |显示全部楼层
回复 9# jzsjm1002

谢谢解答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP