1、expect简介
expect是一款自动化的脚本解释型的工具。
expect基于tcl脚本,expect脚本的运行需要tcl的支持。
expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。
远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。
expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。
2、安装
yum install expect -y
3、常用命令
spawn 新建一个进程,这个进程的交互由expect控制
expect 等待接受进程返回的字符串,直到超时时间,根据规则决定下一步操作
send 发送字符串给expect控制的进程
set 设定变量为某个值
exp_continue 重新执行expect命令分支
[lindex $argv 0] 获取expect脚本的第1个参数
[lindex $argv 1] 获取expect脚本的第2个参数
set timeout -1 设置超时方式为永远等待
set timeout 30 设置超时时间为30秒
interact 将脚本的控制权交给用户,用户可继续输入命令
expect eof 等待spawn进程结束后退出信号eof
4、用法
单一分支
set password 123456
expect "*assword:" { send "$password\r" }
多分支模式写法
set password 123456
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"*assword:" { send "$password\r" }
}
4、使用例子
#!/bin/bash
#同步原gitlab xx组下的project到新的gitlab
#author menard
cd /root/project
project=('project1' 'project2' 'project3')
for i in ${project[*]}
do
/usr/bin/expect <<EOF
set timeout -1
spawn git clone http://172.16.9.66/DOC_NBO/$i.git
expect {
"*Username*" {send "code_ops\r"}
}
expect {
"Password*" {send "password\r"}
}
expect eof
EOF
sleep 3
cd $i
git remote rm origin
git remote add origin http://gitlab-code.xxx.com.cn/doc/$i.git
/usr/bin/expect <<EOF
set timeout -1
spawn git push -u origin --all
expect {
"*Username*" {send "code_ops\r"}
}
expect {
"Password*" {send "password\r"}
}
expect eof
EOF
sleep 3
/usr/bin/expect <<EOF
set timeout -1
spawn git push origin --tags
expect {
"*Username*" {send "code_ops\r"}
}
expect {
"Password*" {send "password\r"}
}
expect eof
EOF
cd /root/project
sleep 1
done