免费注册 查看新帖 |

Chinaunix

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

[文本处理] expect循环的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-12 14:12 |只看该作者 |倒序浏览
再shell中我可以把ip ,port 放在一个单独文件中(file)
通过 while read ip port ;do 。。。 ; done < file 的方式分别调用两个赋值变量。
现在想通过expect的方式写。如何写?
网上的expect 循环范例似乎都很简单。求帮助

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
2 [报告]
发表于 2013-04-12 14:23 |只看该作者
挖坟吧,能找到。CU搜索。

论坛徽章:
0
3 [报告]
发表于 2013-04-12 15:37 |只看该作者
回复 2# wenhq

我看了那些脚本都是一个参数。就ip。端口都是统一的。可是我的端口不是统一的。我的目的是讲ip和port 都列在一个文件中,调用该文件的过程中,将ip和port的变量值对应后,直接指定ssh ${ip} ${port}的方式 密码也不是统一的。

论坛徽章:
0
4 [报告]
发表于 2013-04-12 17:20 |只看该作者
你可以用shell 去封装一层expect 来实现该需求  

[root@localhost shell]# cat ip
192.168.0.1
192.168.0.2
[root@localhost shell]# cat port
22
21
[root@localhost shell]# cat ssh.exp
#!/usr/bin/expect
set port [lindex $argv 0]
set server [lindex $argv 1]
puts "$port ====== $server"
exit 0
expect eof
[root@localhost shell]# cat test.sh
#!/bin/bash
port=(`cat port`)
ip=(`cat ip`)
tmp_key=${#port[*]}
key=`echo $(( ${tmp_key} -1 ))`
for num in `seq 0 ${key}`
do
        ./ssh.exp "${port[${num}]}"  "${ip[${num}]}"
done

[root@localhost shell]# ./test.sh
22 ====== 192.168.0.1
21 ====== 192.168.0.2


目前只想到这个办法 。。希望大牛们批评教导 。。。





论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
5 [报告]
发表于 2013-04-12 17:21 |只看该作者
假设文件内容为 IP 端口,一行一对,空格分隔。可以试试如下代码:

  1. #!/usr/bin/expect --

  2. set fid [open 文件名 r]
  3. while {[gets $fid line] >= 0} {
  4.     set ip   [lindex $line 0]
  5.     set port [lindex $line 1]
  6.    
  7.     puts "IP: $ip, Port: $port\n"
  8. }
  9. close $fid
复制代码
未测试。

论坛徽章:
0
6 [报告]
发表于 2013-04-15 18:36 |只看该作者
回复 5# seesea2517


#!/usr/bin/expect --
set UPLOADADR /root/file
set FID [open ${UPLOADADR} r]
set FZIP [lindex $argv 0]

while { [gets $FID line] >= 0 } {
        set IP [lindex $line 0]
        set PORT [lindex $line 1]
        set PASSWD [lindex $line 2]
        puts "IP: $IP, Port $PORT, password $PASSWD"
        spawn ssh ${IP} -p ${PORT}
        expect "password: " { send "${PASSWD}\r" }
        expect "#" { send "sh ${UPLOADADR} ${FZIP}\r" }
        expect "ename: " { send "A\r" }
        sleep 2
}

嗯,按照你的尝试过了没有问题。楼上的封装,我还没试过,不过这个脚本 本来就要调用远程的shell脚本。这样应该足够了                  

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
7 [报告]
发表于 2013-04-16 09:16 |只看该作者
回复 6# onlinekof2001


    实现了就好。封闭一个 expect 脚本后在 shell 里调用也是一种方案,我也有用过,因为 expect 的语法我不是很熟悉,所以这样的方案对于熟悉 shell,而只是略熟悉 expect 的情况下是很合适的。完全在 expect 下写则要比较熟悉 expect。

论坛徽章:
0
8 [报告]
发表于 2013-04-16 09:29 |只看该作者
非常感谢楼上两位提供的思路以及实现方式。

论坛徽章:
0
9 [报告]
发表于 2013-04-21 18:40 |只看该作者
回复 1# onlinekof2001

i think you mean read file with tcl
cat 2.txt
192.168.1.1
8000
    #!/opt/cool/bin/expect
        if [catch {open 2.txt r} fd] {
        # open failed
        puts stderr "cannot open 2.txt"
        exit 1
        }
       set lineno 0
        while {[gets $fd line] >= 0} {
                incr lineno
                puts "$linenoline \n"
                foreach ln [split $line " "] {
                        puts "$linenoln \n"
                }
        }
        # close both files
        close $fd
       =========
cat 2.txt
192.168.1.1 80
       #!/opt/cool/bin/expect
        if [catch {open 1.txt r} fd] {
        # open failed
        puts stderr "cannot open 1.txt"
        exit 1
        }
        set lineno 0
        while {[gets $fd line] >= 0} {
        incr lineno
        puts "$linenoline \n"
        }
        # close both files
        close $fd
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP