免费注册 查看新帖 |

Chinaunix

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

[系统管理] expect在执行命令返回结果中,有时候只返回一些结果,并卡住 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-04 19:51 |只看该作者 |倒序浏览
10可用积分
在bash中调用expect登录远程主机执行命令。发现expect在执行命令find时,有时候返回正常结果,有时候只返回一些结果,并卡住,然后就不退出。
登录的是同一个远程主机。同一时间执行脚本10次,基本上有5次是卡住的。
将  |xargs -I {} last -f {}    改为 -exec last -f \;  也是一样的情况。请指教下原因。谢谢。

expect <<EOF
   set timeout -1
   log_file ${tmpdir}/${atype}_tmp.txt
   spawn ssh ${user}@${ip}
   expect {
      "yes/no" { send "yes\r";exp_continue}
      "assword" { send "${pw}\r"}
      }
   expect "#"
   send "touch -t ${last_time}  last_time.txt \r"
   expect "#"
   send "find /var/log -type f -name \"wtmp*\" -newer \"last_time.txt\" |xargs -I {} last -f {} \r"
   expect "#"
   send " rm  -f last_time.txt \r"
   expect "#"
   send  "exit\r"
   expect eof
EOF

论坛徽章:
5
金牛座
日期:2013-10-14 14:40:422015年亚洲杯之伊朗
日期:2015-03-26 10:37:012015亚冠之浦和红钻
日期:2015-10-12 17:47:4115-16赛季CBA联赛之山东
日期:2016-01-20 16:43:1215-16赛季CBA联赛之辽宁
日期:2016-03-29 16:43:59
2 [报告]
发表于 2013-12-05 10:00 |只看该作者
SLES11_SP3:~/shell/expect # cat ssh.sh
#!/bin/bash
tmpdir=/tmp
atype=expect_f
pw=suse
user=root
ip="192.168.10.12"
last_time="201301010101"
expect <<EOF
    set timeout -1
    log_file ${tmpdir}/${atype}_tmp.txt
    spawn ssh ${user}@${ip}
    expect {
       "yes/no" { send "yes\r";exp_continue}
       "assword" { send "${pw}\r"}
       }
    expect "#"
    send "touch -t ${last_time}  last_time.txt \r"
    expect "#"
#   send "find /var/log -type f -name \"wtmp*\" -newer \"last_time.txt\" |xargs last -f \r"
    send "find /var/log -type f -name \"wtmp*\" -newer \"last_time.txt\" |xargs -I {} last -f {}\r"
    expect "#"
    send " rm  -f last_time.txt \r"
    expect "#"
    send  "exit\r"
    expect eof
EOF

论坛徽章:
5
金牛座
日期:2013-10-14 14:40:422015年亚洲杯之伊朗
日期:2015-03-26 10:37:012015亚冠之浦和红钻
日期:2015-10-12 17:47:4115-16赛季CBA联赛之山东
日期:2016-01-20 16:43:1215-16赛季CBA联赛之辽宁
日期:2016-03-29 16:43:59
3 [报告]
发表于 2013-12-05 10:05 |只看该作者
我用你这个测试时,执行倒是没问题,,xargs -I...改成个last -f更好看点

唯一遇到的问题是: 连续多次执行,就报错
SLES11_SP3:~/shell/expect # ./ssh.sh
spawn ssh root@192.168.10.12
ssh: connect to host 192.168.10.12 port 22: Cannot assign requested address
expect: spawn id exp5 not open
    while executing
"expect "#""

这个是端口不够用,很多端口都处于TIME_WAIT阶段,
如过是这个问题,你可以先看下端口范围
SLES11_SP3:~/shell/expect # sysctl -a |grep ip_local_port_range
net.ipv4.ip_local_port_range = 9000     9001
小的话,就在/etc/sysctl.conf后面添加,扩大后的端口范围
net.ipv4.ip_local_port_range = 9000     30000
保存退出
执行sysctl -p后再试试

论坛徽章:
0
4 [报告]
发表于 2013-12-05 10:26 |只看该作者
回复 3# itfly3

你脚本显示没有登录远程主机。我的是登录上远程主机,并find执行命令返回了部分结果,然后卡住不动,也不退出主机。两者情况不一样。
你的脚本返回多少结果?我成功执行的话,完整返回180行;只返回部分结果,有时候就返回100行就不动了。

   

论坛徽章:
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 [报告]
发表于 2013-12-05 10:26 |只看该作者
1. 加上 exp_internal 1 开启调试自己观察一下
2. 通常expect "#" 会写成 expect "# "
3.send "find /var/log -type f -name \"wtmp*\" -newer \"last_time.txt\" |xargs -I {} last -f {} \r"
改成
send {find /var/log -type f -name "wtmp*" -newer "last_time.txt" |xargs -I {} last -f {}}
send " \r"

论坛徽章:
5
金牛座
日期:2013-10-14 14:40:422015年亚洲杯之伊朗
日期:2015-03-26 10:37:012015亚冠之浦和红钻
日期:2015-10-12 17:47:4115-16赛季CBA联赛之山东
日期:2016-01-20 16:43:1215-16赛季CBA联赛之辽宁
日期:2016-03-29 16:43:59
6 [报告]
发表于 2013-12-05 10:55 |只看该作者
我用200个文件作为目标文件,,for执行脚本10次也是没问题
返回信息就是200个
不知道你那是什么情况了
你可以把那个脚本内容复制下,粘贴到一个新的文件中,,有时可能在编辑时格式有些不对

论坛徽章:
0
7 [报告]
发表于 2013-12-05 12:38 |只看该作者
回复 6# itfly3

我是直接编辑,所以不是有乱码问题。并且有时候是能执行成功的。
   

论坛徽章:
0
8 [报告]
发表于 2013-12-05 12:48 |只看该作者
回复 5# waker

都尝试了,还是不行。使用 -d 还是 exp_internal 1 进行调试时,发现貌似卡在expect_out(buffer)。我设置 set match_max 500000,还是不行。运行结果如下

..................
root  pts/0  1.1.1.1  Mon Nov 21 17:10 - 17:12 ( 00:01)
root  pts/0  1.1.1.2
expect: does “2 (01:50) \r\n  root  pts/0  1.1.1.1  Mon Nov 21 17:00 - 17:02 ( 00:01) \r\n  root  pts/0  1.1.1.1  Mon Nov 21 17:01 - 17:02 ( 00:01)
................
(spawn_id exp5) match glob pattern "# "?  no
expect: set expect_out(spawn_id) "exp5"
expect: set expect_out(buffer)    " Nov 21 17:03 - 17:04 ( 00:01) \r\n root  pts/0  1.1.1.1  Mon Nov 21 17:04 - 17:05 ( 00:01) \r\n
...............
root  pts/0  1.1.1.1  Mon Nov 21 17:00 - 17:02 ( 00:01) \r\n"

---------------------------然后卡住就不动了。
   

论坛徽章:
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
9 [报告]
发表于 2013-12-05 13:58 |只看该作者
expect没有等到"# "
建议你先不要xargs 看看find的结果有什么不同

论坛徽章:
0
10 [报告]
发表于 2013-12-05 14:47 |只看该作者
回复 9# waker
使用 -exec last -f {} \;  或者重定向到一个文件再cat出来,情况依然如此。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP