bash命令:expect 自动输入账号、密码等信息
一. 简介
买了太多vps,每个新开的vps都手动安装一遍之前的服务会很麻烦,尤其我这种抱侥幸心理买低价vps,经常会遇到重装母鸡、格式化所有数据的坑货vps商家。
所以很有必要维护个自动部署脚本,一键安装现有的所有服务。
写自动部署脚本的时候,会遇到这样一个场景,例如svn co代码库的时候,会让你输入svn账号、密码、是否记住密码这些信息,如果我每次都手动输入这些,这个脚本就没法自动部署了。
那么怎么解决这个问题呢?答案是使用expect命令。
二.expect
安装很简单,只需要执行下面命令就可以
yum -y install expect
有2种使用方式
-
新建个指定expect打开的文件,如下
#!/usr/bin/expect set timeout 3 xxx
-
在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
说明
- EOF是end of file的缩写,这儿用于在脚本文件中生成一个单独文件,使用expect执行。
- 先set time 30,超时时间,如果30s还没输入,则表示失败,为什么这么写,不清楚,我抄来的
- spawn svn co ${SVN_URL} ${SVN_DES_DIR},在需要输入信息的命令之前加上spawn命令
- 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准没错,用起来。
参考: