• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    利用expect命令实现Shell自动化交互的方法详解

    背景

    linux脚本中有很多场景是进行远程操作的,例如远程登录ssh、远程复制scp、文件传输sftp等。这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的。为了实现自动化远程操作,我们可以借用expect的功能。

    expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。

    expect的安装

    expect是在Tcl基础上创建起来的,所以在安装expect前我们应该先安装Tcl。

    (一)Tcl 安装

    主页: http://www.tcl.tk

    下载地址: http://www.tcl.tk/software/tcltk/downloadnow84.tml

    1.下载源码包

    wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz 

    2.解压缩源码包

    tar xfvz tcl8.4.11-src.tar.gz 

    3.安装配置

    cd tcl8.4.11/unix 
    ./configure --prefix=/usr/tcl --enable-shared 
    make 
    make install 

    注意:

    1、安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。

    2、暂时不要删除tcl源代码,因为expect的安装过程还需要用。

    (二)expect 安装 (需Tcl的库)

    主页: http://expect.nist.gov/

    1.下载源码包

    wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download 

    2.解压缩源码包

    tar xzvf expect5.45.tar.gz 

    3.安装配置

    cd expect5.45 
    ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic 
    make 
    make install 
    ln -s /usr/tcl/bin/expect /usr/expect/bin/expect 

    expect

    expect的核心是spawn、expect、send、set。

    spawn 调用要执行的命令

    expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。

    其他设置

    expect编写语法

    expect使用的是tcl语法

    示例

    login.exp专用于远程登录,快捷使用方式: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"

    #!/usr/bin/expect -f
    ##########################################################
    # 通过SSH登陆和执行命令
    #参数:1.Use_Type [check/execute]
    #  2.SSHServerIp
    #  3.SSHUser
    #  4.SSHPassword
    #  5.CommandList [多个命令间以;间隔]
    #返回值:
    #  0 成功
    #  1 参数个数不正确
    #  2 SSH 服务器服务没有打开
    #  3 SSH 用户密码不正确
    #  4 连接SSH服务器超时
    ##########################################################
    proc usage {} {
     regsub ".*/" $::argv0 "" name
     send_user "Usage:\n"
     send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n"
     exit 1
    } 
    ## 判断参数个数
    if {[llength $argv] != 5} {
     usage
    }
    #设置变量值
    set Use_Type [lindex $argv 0]
    set SSHServerIp [lindex $argv 1]
    set SSHUser [lindex $argv 2]
    set SSHPassword [lindex $argv 3]
    set CommandList [lindex $argv 4]
    #spawn ping ${SSHServerIp} -w 5
    #expect {
    # -nocase -re "100% packet loss" {
    #  send_error "Ping ${SSHServerIp} is unreachable, Please check the IP address.\n"
    #  exit 1
    # }
    #}
    set timeout 360
    set resssh 0
    #定义变量标记ssh连接时是否输入yes确认
    set inputYes 0
    set ok_string LOGIN_SUCCESS
    if {$Use_Type=="check"} {
     #激活ssh连接,如果要需要输入yes确认,输入yes,设置inputYes为1,否则输入ssh密码
     spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string"
    } else {   
     spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList"
    }
    expect {
     -nocase -re "yes/no" {
      send -- "yes\n"
      set inputYes 1
     }
     -nocase -re "assword: " {
      send -- "${SSHPassword}\n"
      set resssh 1
     }
     #-nocase -re "Last login: " { 
     #  send -- "${CommandList}\n"
     #}
     $ok_string {}
     -nocase -re "Connection refused" {
      send_error "SSH services at ${SSHServerIp} is not active.\n"
      exit 2
     }
     timeout {
      send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s).\n"
      exit 4
     }
    }
    #如果输入了yes确认,输入ssh密码
    if {$inputYes==1} {
     expect {
      -nocase -re "assword: " {
       send -- "${SSHPassword}\n"
       set resssh 1
      }
     }
    }
    #如果出现try again或者password:提示,说明输入的用户密码错误,直接退出。
    if {$resssh==1} {
     expect {
      -nocase -re "try again" {
       send_error "SSH user:${SSHUser} passwd error.\n"
       exit 3
      }
      -nocase -re "assword:" {
       send_error "SSH user:${SSHUser} passwd error.\n"
       exit 3
      }
      eof {}
     }
    }
    send_error -- "$expect_out(buffer)"
    #-nocase -re "No such user" {
    #  send_error "No such user.\n"
    #  exit 5
    # }
    #exit

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • Linux expect实现自动登录脚本实例代码
    • shell脚本无密码登录 expect的使用方法详解
    • Linux下使用expect命令编写自动化交互脚本
    • 详解Linux使用shell+expect远程登录主机
    • ssh expect自动登录的脚本代码
    • linux expect 自动登录交换机保存配置的方法
    上一篇:linux上搭建solr的实现方法(用jetty部署)
    下一篇:Linux定义变量脚本分享
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    利用expect命令实现Shell自动化交互的方法详解 利用,expect,命令,实现,Shell,