免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2659 | 回复: 10

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

论坛徽章:
1
19周年集字徽章-19
日期:2019-08-22 08:47:17
发表于 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

论坛徽章:
0
发表于 2019-08-20 16:27 |显示全部楼层
本帖最后由 jzsjm1002 于 2019-08-20 16:31 编辑
  1. #!/bin/bash
  2. #

  3. dip=IP
  4. pw=密码

  5. login_exp(){
  6.   expect -c "spawn ssh root@$1 -p22
  7.     set timeout -1
  8.     expect {
  9.       \"yes/no\" {send \"yes\r\";exp_continue;}
  10.       \"word:\" {send \"$2\r\";}
  11.     }
  12.     expect \"# \" {send \"clear\r\";}
  13.     expect \"# \" {send \"date \\\"+%Y-%m-%d %H:%M:%S\\\"\r\";}
  14.     expect \"# \" {send \"sleep 2\r\";}
  15.     expect \"# \" {send \"date \\\"+%Y-%m-%d %H:%M:%S\\\"\r\";}
  16.     expect \"# \" {send \"sleep 2\r\";}
  17.     expect \"# \" {send \"date \\\"+%Y-%m-%d %H:%M:%S\\\"\r\";}
  18.     expect \"# \" {send \"sleep 2\r\";}
  19.     expect \"# \" {send \"date \\\"+%Y-%m-%d %H:%M:%S\\\"\r\";}
  20.     expect \"# \" {send \"exit\r\";}
  21.     interact"
  22. }

  23. login_exp $dip $pw
复制代码
123.png

论坛徽章:
1
19周年集字徽章-19
日期:2019-08-22 08:47:17
发表于 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



论坛徽章:
0
发表于 2019-08-20 17:50 |显示全部楼层
本帖最后由 jzsjm1002 于 2019-08-20 18:02 编辑
  1. sed -i "$(awk '/^test123/{print NR;exit}' file)s/^test123/#&/" file
复制代码


有大批量的命令需要执行 建议写成脚本通过expect scp过去 然后在登录执行
因为转义很麻烦

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

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

论坛徽章:
0
发表于 2019-08-20 18:06 |显示全部楼层
本帖最后由 jzsjm1002 于 2019-08-20 18:24 编辑

回复 5# mychnunixwebsit

不好意思 你是需要执行两次 依次进行修改对吗 我改好了


123.png

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


论坛徽章:
1
19周年集字徽章-19
日期:2019-08-22 08:47:17
发表于 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'



论坛徽章:
0
发表于 2019-08-26 21:46 |显示全部楼层
回复 8# mychnunixwebsit

嗯 其实我已经回复你了 但是回复内容被论坛吞了 我以为和以前一样 过几天会返回出来的 但是没有~

论坛徽章:
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
发表于 2019-08-27 07:21 |显示全部楼层
  1. /usr/bin/expect>>log/log.log 2>&1<<\EOF

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

  5.     send "$4\r"
  6.     sleep 1

  7.     send "su $5\r"
  8.     sleep 1

  9.     send "$6\r"
  10.     sleep 1

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

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

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

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

  19.     send "exit\r"
  20.     send "exit\r"

  21. expect eof
  22. EOF
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2021中国系统架构师大会

【数字转型 架构重塑】2021年5月20日-22日第十三届中国系统架构师大会将在云端进行网络直播。

大会为期3天的议程,涉及20+专场,近120个主题,完整迁移到线上进行网络直播对会议组织来说绝非易事;但考虑到云端会议的直播形式可以实现全国各地技术爱好者的参与,也使ITPUB作为技术共享交流平台得到更好的普及,我们决定迎难而上。
http://sacc.it168.com/


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP