wangbin
  • wangbin
  • 2019-08-25
  • IT

bash命令:expect 自动输入账号、密码等信息

一. 简介

买了太多vps,每个新开的vps都手动安装一遍之前的服务会很麻烦,尤其我这种抱侥幸心理买低价vps,经常会遇到重装母鸡、格式化所有数据的坑货vps商家。

所以很有必要维护个自动部署脚本,一键安装现有的所有服务。

写自动部署脚本的时候,会遇到这样一个场景,例如svn co代码库的时候,会让你输入svn账号、密码、是否记住密码这些信息,如果我每次都手动输入这些,这个脚本就没法自动部署了。

那么怎么解决这个问题呢?答案是使用expect命令。

二.expect

安装很简单,只需要执行下面命令就可以

yum -y install expect

有2种使用方式

  1. 新建个指定expect打开的文件,如下

    #!/usr/bin/expect
    set timeout 3
    xxx
  2. 在bash脚本中使用EOF,在EOF中执行expect命令

我使用的第2种方式,方便。

三.SVN使用场景

具体如何使用,结合我的使用例子来说,比较好理解

yum -y install expect

mkdir -p /vps
SVN_URL="https://svn.siyou325.com/siyou325/vps/save"
SVN_DES_DIR=/vps/save
SVN_USER="xxx"
SVN_PASSWD="xxx"

expect<<-EOF
    set time 30

    spawn svn co ${SVN_URL} ${SVN_DES_DIR}
    expect { 
        "Password for 'root': " { send "\r"; exp_continue; } 
        "*Username:*" { send "${SVN_USER}\r";exp_continue; } 
        "*Password for '*':*" { send "${SVN_PASSWD}\r";exp_continue; } 
        "*Store password unencrypted (yes/no)?*" { send "yes\r";exp_continue; } 
    } 
EOF

说明

  1. EOF是end of file的缩写,这儿用于在脚本文件中生成一个单独文件,使用expect执行。
  2. 先set time 30,超时时间,如果30s还没输入,则表示失败,为什么这么写,不清楚,我抄来的
  3. spawn svn co ${SVN_URL} ${SVN_DES_DIR},在需要输入信息的命令之前加上spawn命令
  4. expect {}这儿就是最终的精髓了,意思也很简单,如果要输入的提示语满足某个匹配规则,则输入预设好的值,可以使用"*"匹配任意字符串。

仔细看看,是不是很好理解。

四. GIT使用场景

再来一个GIT的例子

yum -y install expect

mkdir -p /vps
GIT_DES_DIR=/vps/hosts/licaicai
GIT_URL="https://git.wangbin.io/yangshuang/licaicai.git"
GIT_USER="xxx"
GIT_PASSWD="xxx"

expect<<-EOF
    set time 30

    spawn git clone ${GIT_URL} ${GIT_DES_DIR}
    expect { 
        "Password for 'root': " { send "\r"; exp_continue; } 
        "*Username*" { send "${GIT_USER}\r";exp_continue; } 
        "*Password*" { send "${GIT_PASSWD}\r";exp_continue; } 
    } 
EOF

五. 结尾

需要输入账号、密码等信息的交互场景,使用expect准没错,用起来。

参考:

  1. https://www.cnblogs.com/chenpingzhao/p/4725838.html