zoukankan      html  css  js  c++  java
  • Linux--使用expect进行自动交互

    在linux下进行一些操作时,有时需要与机器进行一些交互操作,比如切换账号时输入账号密码,传输文件时输入账号密码登陆远程机器等,但有时候这些动作需要在shell脚本中进行,这个时候就可以使用expect来进行自动的交互操作,从而避免需要人工干预引起的脚本中断执行。

    expect的核心命令:spawn expect send set

    spawn 调用要执行的命令
    expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:
    send 发送需要交互的值,替代了用户手动输入内容
    set 设置变量值
    interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
    expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
    (expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。)

    例子:建一个scp.sh脚本,用来传输文件

    #!/bin/sh
    svr="9.84.214.35"
    
    expect <<!
    spawn scp -r xman@$svr:/db2info.csv /tmp/db2info.txt
    expect {
            "(yes/no)?"
                    {
                            send "yes
    "
                            expect "*assword:" {send "1qaz2wsx
    "} 
                    } 
            "*assword:"
                    {
                            send "1qaz2wsx
    "
                    } 
    } 
    expect "100%"
    expect eof
    !

    执行./scp.sh就会使用账户xman,去登陆远程机器,这是终端会给出提示信息问是否继续Yes/No? 如果yes就输入密码,登陆成功后scp命令就开始传文件。其中expect{}里面的代码就是预判断终端输出的内容里是否有(yes/no)?,如果有就自动输入yes,(send "yes ");然后再判断后面的输出里是否含有*password:",如果有就自动输入预置的密码1qaz2wsx。从而达到自动进行交互的目的。

    除了用 expect <<!  !方式(here document方式)在sh中调用expect外,当然也可以用expect -c "" 的方式在sh脚本里调用expect命令。 

    
    
  • 相关阅读:
    Kibana详细入门教程
    Python爬取食品商务网蔬菜价格数据,看看蔬菜最近的价格情况
    用Python爬取某蔬菜网的行情,分析底哪个地区的蔬菜便宜
    ES启动失败;java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.c
    ELK 5.0 组件后台启动
    linux中/etc/security/limits.conf配置文件说明
    redis面试常见问题
    单线程的Redis为什么能支持10w+的QPS?
    Redis大Key优化
    redis中查找大key方法汇总
  • 原文地址:https://www.cnblogs.com/jingwei/p/4863554.html
Copyright © 2011-2022 走看看