1.需求
最近需要使用scp自动将本地服务器的文件拷贝到远程服务器上;
2.安装expect
#安装expect前,需要安装tcl环境
yum -y install tcl
yum -y install expect
3.expect脚本
#!/usr/bin/expect
set passwd "xxxx"
set ip "192.168.x.xxx"
set username "scpuser"
#不论是在此脚本内自动输入密码还是在脚本外手工输入密码,至少要等待5秒
set timeout 5
spawn scp -P 62471 /opt/module/jobs/xx.txt $username@$ip:/home/scpuser
#当检测到 password 时,会自动发送 $passwd 并回车
expect {
"password"
{
send "$passwd
"
}
"yes/no"
{
sleep 5
send "yes
"
}
}
# 退出spawn开启的进程
send "exit
"
# 退出此expect交互程序
expect eof
问题:不能通过 sh 脚本的方式运行expect脚本
4.shell脚本使用expect工具
#!/bin/bash
passwd="xxxx"
username="scpuser"
ip="192.168.x.xxx"
# 指定执行引擎
/usr/bin/expect <<EOF
#不论是在此脚本内自动输入密码还是在脚本外手工输入密码,至少要等待5秒
set timeout 5
spawn scp -P 62471 /opt/module/jobs/xxx.txt $username@$ip:/home/scpuser
#当检测到 password 时,会自动发送 $passwd 并回车
expect {
"password"
{
send "$passwd
"
}
"yes/no"
{
sleep 5
send "yes
"
}
}
# 退出spawn开启的进程
send "exit
"
# 退出此expect交互程序
expect eof
EOF
5.注意expect eof 和 interact 的区别
interact: 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
expect eof: 结束expect匹配