expect实现脚本的 自动交互

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匹配

原文地址:https://www.cnblogs.com/wuning/p/11909084.html