免费注册 查看新帖 |

Chinaunix

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

求教expect达人,如何将远程主机执行命令的结果赋值给变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-27 21:41 |只看该作者 |倒序浏览
求教expect达人,如何将远程主机执行命令的结果赋值给变量,或者是写入本机的文件中....

另外,在expect中如何使用awk将命令的执行结果过滤一下..

论坛徽章:
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
2 [报告]
发表于 2009-07-28 08:10 |只看该作者
>如何将远程主机执行命令的结果赋值给变量
可以用expect命令,结果在expect_out数组中,参见expect的manpage

>或者是写入本机的文件中....
open本机文件, puts结果到文件句柄,这些命令参见tcl语言的教程

>另外,在expect中如何使用awk将命令的执行结果过滤一下.
expect是个全功能的语言,你会考虑在perl里面调用awk过滤一下么?
如果非要用,可以exec awk命令
当然也可以spawn awk和它交互


顺便建议一下,如果想学习一门语言的话,先粗略而全面的了解它可能比深入精细钻研有效,比针对什么XX例子具体解决更有效

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-08-11 06:20:00
3 [报告]
发表于 2009-07-28 10:26 |只看该作者
要不坐沙发的都是高手,领导呢,俺做板凳!!!

论坛徽章:
0
4 [报告]
发表于 2009-07-28 20:50 |只看该作者
原帖由 waker 于 2009-7-28 08:10 发表
>如何将远程主机执行命令的结果赋值给变量
可以用expect命令,结果在expect_out数组中,参见expect的manpage

>或者是写入本机的文件中....
open本机文件, puts结果到文件句柄,这些命令参见tcl语言的教程 ...


哈哈..就等着waker大大呢.....谢谢了..

当时我想到的expect_out,可是英文的manpage对于英文很烂的我,看的似懂非懂.中文教程介绍的却少的可怜...试了好多次expect_out放置的位置都不对,总是取不到数据....不过现在终于搞定了..


记得大大您曾经介绍过一种方法send_user [exec echo "asdfasdf" >> file.txt] 这个方法方便简单..很好用/cy

在expect中使用awk...是因为tcl语言掌握的还不太熟,感觉用awk会更简单些.

国内expect的教程感觉介绍的内容少了..而且实例也不多.....看英文的manpage是在是一头雾水...~

希望waker版主能够提供多提供一些关于expect和tcl的资料....谢谢了....expect这么强大..怎么感觉用的人很少呢..

论坛徽章:
0
5 [报告]
发表于 2009-08-05 14:41 |只看该作者
发现还有些问题..把贴顶起...重新问....

除了expect_out(buffer)之外有没有类似于 set var1 [send "command\r"]这样的方法把command在远程执行的结果赋值给var1

我试过set varinfo  [string range $expect_out(buffer) 178 184]这样的方式...可是想取回的结果,在$expect_out(buffer)中有太多的"\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
6 [报告]
发表于 2009-08-05 15:03 |只看该作者

回复 #5 从未被和谐 的帖子

你发给spawn_id的命令结果当然是要用expect来取得了,expect是模拟一个tty然后和程序交互
交互的内容它是不会懂的,是命令还是什么它不会区分,它只负责发信息收信息
[]是取得tcl命令的返回值

你要过滤expect到的内容可以用 expect -re xxx(ooo)xxx的形式捕获啊,结果在expect_out(xxoo,string)中
也可以使用tcl的regexp命令处理expect_out(buffer)中的内容


book.google.com有本expect的经典exploring expect

tcl的书好像IT图书版就有,搜搜吧

论坛徽章:
0
7 [报告]
发表于 2009-08-06 11:22 |只看该作者
还是要回来求助waker
在使用正则表达式时.总是匹配不上..使用-d的时候有个地方不太明白,请麻烦帮忙看一眼..


在A主机上执行test.exp脚本
  1. #!/usr/bin/expect -d
  2. spawn ssh **@$ip
  3. expect {
  4.         "yes/no" {send "yes\r";exp_continue}
  5.         "password:" {send "$passwd\r"}
  6.         }
  7. expect {
  8.         "~]#" {send "./test.sh\r";}
  9.         }
  10. expect {
  11.         -re  "\r\n\[:alnum:\]\{6\}\r\n" {send " ============ $expect_out(buffer) ===========\r"}
  12.         }
复制代码



主机B上的脚本内容:test.sh
echo "abcdef"


输出信息.:
  1. ./test.exp  
  2. expect version 5.44.1.11
  3. argv[0] = /usr/bin/expect  argv[1] = -d  argv[2] = ./test.exp  
  4. set argc 0
  5. set argv0 "./test.exp"
  6. set argv ""
  7. executing commands from command file ./test.exp
  8. spawn ssh **@ip
  9. parent: waiting for sync byte
  10. parent: telling child to go ahead
  11. parent: now unsynchronized from child
  12. spawn: returns {2875}
  13. expect: does "" (spawn_id exp4) match glob pattern "yes/no"? no
  14. "password:"? no
  15. **@$ip's password:
  16. expect: does "**@$ip's password: " (spawn_id exp4) match glob pattern "yes/no"? no
  17. "password:"? yes
  18. expect: set expect_out(0,string) "password:"
  19. expect: set expect_out(spawn_id) "exp4"
  20. expect: set expect_out(buffer) "**@$ip's password:"
  21. send: sending "$passwd\r" to { exp4 }
  22. expect: does " " (spawn_id exp4) match glob pattern "~]#"? no

  23. expect: does " \r\n" (spawn_id exp4) match glob pattern "~]#"? no
  24. Last login: Thu Aug  6 10:57:46 2009 from $ip
  25. expect: does " \r\nLast login: Thu Aug  6 10:57:46 2009 from $ip\r\r\n" (spawn_id exp4) match glob pattern "~]#"? no
  26. [$user@linux-server80 ~]#
  27. expect: does " \r\nLast login: Thu Aug  6 10:57:46 2009 from $ip\r\r\n[$user@linux-server80 ~]# " (spawn_id exp4) match glob pattern "~]#"? yes
  28. expect: set expect_out(0,string) "~]#"
  29. expect: set expect_out(spawn_id) "exp4"
  30. expect: set expect_out(buffer) " \r\nLast login: Thu Aug  6 10:57:46 2009 from $ip\r\r\n[$user@linux-server80 ~]#"
  31. send: sending "./test.sh\r" to { exp4 }
  32. Gate keeper glob pattern for '
  33. [:alnum:]{6}
  34. ' is '
  35. *
  36. '. Activating booster.
  37. expect: does " " (spawn_id exp4) match regular expression "\r\n[:alnum:]{6}\r\n"? Gate "\r\n*\r\n"? gate=no
  38. ./t
  39. expect: does " ./t" (spawn_id exp4) match regular expression "\r\n[:alnum:]{6}\r\n"? Gate "\r\n*\r\n"? gate=no
  40. es
  41. expect: does " ./tes" (spawn_id exp4) match regular expression "\r\n[:alnum:]{6}\r\n"? Gate "\r\n*\r\n"? gate=no
  42. t.
  43. expect: does " ./test." (spawn_id exp4) match regular expression "\r\n[:alnum:]{6}\r\n"? Gate "\r\n*\r\n"? gate=no
  44. s
  45. expect: does " ./test.s" (spawn_id exp4) match regular expression "\r\n[:alnum:]{6}\r\n"? Gate "\r\n*\r\n"? gate=no
  46. h
  47. expect: does " ./test.sh\r\n" (spawn_id exp4) match regular expression "\r\n[:alnum:]{6}\r\n"? Gate "\r\n*\r\n"? gate=no
  48. abcdef
  49. expect: does " ./test.sh\r\nabcdef\r\n" (spawn_id exp4) match regular expression "\r\n[:alnum:]{6}\r\n"? Gate "\r\n*\r\n"? gate=yes re=no
  50. [$user@linux-server80 ~]#
  51. expect: does " ./test.sh\r\nabcdef\r\n[$user@linux-server80 ~]# " (spawn_id exp4) match regular expression "\r\n[:alnum:]{6}\r\n"? Gate "\r\n*\r\n"? gate=yes re=no
  52. expect: timed out
复制代码


这里的"gate=yes re=no"不知道是什么意思
[:alnum:]{6}不能匹配"abcdef"吗?

论坛徽章:
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
8 [报告]
发表于 2009-08-06 13:05 |只看该作者

回复 #7 从未被和谐 的帖子

[:alnum:]还是[[:alnum:]]?

论坛徽章:
0
9 [报告]
发表于 2009-08-06 13:20 |只看该作者
惭愧....

谢谢waker

论坛徽章:
0
10 [报告]
发表于 2014-08-26 17:58 |只看该作者
回复 2# waker

求救啊,expect 远程登录到其他主机,怎样得到上一条命令的结果啊。
我用expect写的脚本如下:
expect<<EOC
         spawn ssh $1
         expect {
                                  "(yes/no)?" {send "yes\r"; exp_continue }
                                  "password:" {send  "12345678\r"}
                 }
     expect "password:"
     send "12345678\r"
         expect "#"
         send "ps -ef | grep /usr/local/sbin/glusterd | grep -v grep | wc -l  \r"
         expect -re {[0-9]*}
         puts "output: $expect_out(buffer)"
         #puts "result is $result"
         send "exit\n"
         expect eof
EOC
为什么得不到结果啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP