zoukankan      html  css  js  c++  java
  • shell脚本通过expect脚本实现自动输入密码

     背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现
     
    一.在shell脚本中嵌入expect来实现密码输入
    expect是一个自动交互功能的工具。expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send)
    1.安装expect 
    需要先安装tcl:apt-get install tcl
    apt-get install expect
    (输入expect查看是否能够进入expect解释器可以判断是否安装成功)
    注:我是用的utuntu系统。如果是用centos可以直接用yum install expect进行安装
    2.expect使用
    2.1一个简单的输入密码操作
    #!/usr/bin/expect
    set timeout 100
    set password "123456"
    spawn sudo rm -rf zzlogic
    expect "root123456"
    send "$password "
    interact
    说明:
    第一行#!/usr/bin/expect表示使用expect的shell交互模式
    set是对变量password赋值
    set timeout 100:设置超时时间为100秒,如果要执行的shell命令很长可以设置超时时间长一些。expect超过超时时间没有监测到要找的字符串,则不执行,默认timeout为10秒
    spawn在expect下执行shell脚本
    expect对通过spawn执行的shell脚本的返回进行判断,是否包含“”中的字段
    send:如果expect监测到了包含的字符串,将输入send中的内容, 相当于回车
    interact:留在开的子进程内,可以继续输入,否则将退出子进程回到shell中(比如ssh登录到某台服务器上,只有加了interact才可以留在登录后的机器上进行操作)
     
    2.2expect的命令行参数
    [lindex $argv n]获得index为n的参数(index从0开始计算)
    $argc为命令行参数的个数
    [lrange $argv 0 0]表示第一个参数
    [lrange $argv 0 3]表示第1到第3个参数
     
    例如scp_service.sh文件,可以./scp_service.sh -rm来执行,这时是赋值了一个参数
    set option  [lindex $argv 0](获得第一个参数存到变量option中,参数是的index是从0开始计算的)
     
    2.3if...elif...else...
    expect支持if语句,
    if { 条件1 } {
         条件1执行语句
    } elif { 条件2 } {
         条件2执行语句
    } else {
         其他情况执行语句
    }
    说明:
    1.if的条件用{}来包含条件
    2.if和后面的{}必须有空格隔开
    3.两个花括号之间必须有空格隔开,比如if {} {},否则会报错 expect:extra characters after close-brace
    3.使用{来衔接下一行,所以if的条件后需要加左花括号{
    4.else不能单独放一行,所以else要跟在}后面
     
     
    2.4 expect {},多行期望,匹配到哪条执行哪条
    背景:有时执行shell后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码,所以可以用expect{}(比如sudo命令,第一次使用sudo时需要输入密码,但是它有5分钟的有效时间,5分钟内是不需要再去输入的)
    花括号内放多行语句,从上至下匹配,匹配到哪个expect执行哪句。(这里如果匹配到第一行会执行第一行;然后第一行的执行结果如果匹配到第二行也会执行第三行;如果某一行没有匹配到会向下寻找匹配到的那一行进行执行)
    注意:多行的expect的{后不要跟语句,否则读不到这条。需要换行后去写具体的期望值和操作。
     
    说明:exp_continue表示继续执行下面的expect。
     
    3.shell中调用expect来实现登录
    我是通过在shell脚本中执行expect脚本的方式来实现的。当然可以将shell中定义的一些变量传递给expect脚本作为参数输入。可以见我下图调用的一个例子
    说明:经过这次尝试些expect,给我的感觉是expect对格式的要求比较高,比如花括号之间必须有空格啊之类的,所以如果有报错,大家可以仔细观察一下是不是语法格式错误了。
     
    二.在远程服务器上配置ssh信任
    这个我暂时没有试,网上有很多教程,感觉长期的话应该比写expect方便,但是我觉得写脚本的话还是最好不要总去操作其他地方,所以这里我就用expect自己来写的(当然也是想练习一下写expect)
  • 相关阅读:
    NoHttp封装--03 cookie
    NoHttp封装--02 自定义请求
    NoHttp封装--01
    Cookie管理 WebView同步
    Java注解处理器--编译时处理的注解
    Android联网更新应用
    shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
    磁盘管理 之 parted命令添加swap,文件系统
    磁盘管理之 raid 文件系统 分区
    用户管理上
  • 原文地址:https://www.cnblogs.com/meitian/p/5154230.html
Copyright © 2011-2022 走看看