shell编程中expect 的一般用法

在Shell编程中,expect是一个强大的工具,它基于Tcl语言开发,主要用于自动化交互式程序的控制。当执行脚本时遇到需要用户输入的情况(如SSH登录、密码验证或其他等待输入的命令行程序),可以使用expect来模拟这些交互过程,从而实现非交互式的自动化执行。

以下是expect的基本用法和关键命令:

  1. 安装expect: 在支持yum的Linux系统中,可以通过以下命令安装:

    sudo yum -y install expect
  2. 编写expect脚本的基本结构

    #!/usr/bin/expect
    
    # 启动一个子进程并追踪其输出
    spawn command [arguments]
    
    # 预期捕获到特定字符串
    expect "expected_string"
    
    # 根据捕获的内容发送相应的输入
    send "input_string\r"
    
    # 可以重复以上步骤进行多轮交互
    ...
    
    # 退出spawn启动的子进程
    expect eof
    spawn: 启动一个新的进程(如ssh、telnet等)并与之交互。
    expect: 等待指定的模式出现,该模式可以是正则表达式。
    send: 发送文本到当前spawn的进程中,\r 表示回车。
    exp_continue: 如果期望的模式匹配成功,则继续等待下一个期望,不退出脚本。
    interact: 当所有预定义交互完成后,允许人工接管控制台。
    eof: 等待子进程结束。

  3. 示例用法:

    #!/bin/bash
    
    for i in `seq 23 128`
    do
    	num=`echo $i|awk '{printf("%03d\n",$0)}'`
    	/usr/bin/expect << EOF
    	set timeout 30
    	spawn scp -r kwd-ww test@test$num:/opt/ul/kwd-ww_new
        spawn cp /opt/ul/kwd-ww/bin/license_94.dat /opt/ul/kwd-ww/bin/license.dat\
    	/opt/ul/kwd-ww/bin/license_speechid.dat /opt/ul/kwd-ww_new/kwd-ww/bin\
    	&& mv /opt/ul/kwd-ww /opt/ul/kwd-ww_20230210\
    	&& mv /opt/ul/kwd-ww_new/kwd-ww /opt/ul
    
    	expect {
    		"*yes/no" { send "yes\r";exp_continue }
    		"*password:" { send "test@123$%^\r" }
    	}
    	expect eof
    EOF
    done
    

    以下是优化的版本

    #!/bin/bash
    
    password="test@123$%^"
    auto_answer="yes\r"
    
    for i in $(seq 23 128); do
        num=$(printf "%03d" $i)
        
        /usr/bin/expect << EOF
        set timeout 30
        spawn bash -c "scp -r kwd-ww test@test${num}:/opt/ul/kwd-ww_new && \
            ssh test@test${num} 'cd /opt/ul/kwd-ww_new/kwd-ww/bin && \
                cp /opt/ul/kwd-ww/bin/license_94.dat license.dat && \
                cp /opt/ul/kwd-ww/bin/license_speechid.dat . && \
                cd /opt/ul && mv kwd-ww kwd-ww_20230210 && \
                mv kwd-ww_new/kwd-ww .'"
    
        expect {
            "*yes/no*" { send "$auto_answer"; exp_continue }
            "*password:" { send "$password\r" }
        }
        expect eof
    EOF
    done

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值