因为使用到sftp,只能用交互方式输入密码,但是人工交互又不方便,想考虑自动,查询资料发现expect方式可以实现
一、安装expect
root 权限下,yum安装命令:
yum -y install expect
二、
#!/bin/bash
pwd='123456'
ls_date=`date +%Y-%m-%d`
expire_me="R_rhp-report_ALL_daily_"${ls_date}".txt"
curdir=$(cd $(dirname $0); pwd)
echo $pwd
echo $expire_me
echo $curdir
/usr/bin/expect <<-EOF
spawn sftp kaifatest@reports.afilias.info;
expect {
"kaifatest@reports.afilias.info's password:" {send_user $pwd;send "$pwd\r";exp_continue}
"sftp>" {send "get $expire_me $curdir\rquit\r";exp_continue}
}
expect eof;
EOF
exit
解释:
#!/bin/bash => shell脚本执行,如果不需要shell,而是全部expect,则可以:#!/usr/bin/expect
/usr/bin/expect <<-EOF => 此处开始执行expect脚本,记住EOF前面的“-”
expect中最关键的四个命令是send,expect,spawn,interact。
send:用于向进程发送字符串
expect:从进程接收字符串
spawn:启动新的进程
interact:执行完成后保持交互状态,把控制权交给控制台,这个时候便可以手工操作。如果没有该命令,命令完成后即退出
1、spawn命令是Expect的初始命令,它用于启动一个进程,之后所有expect操作都在这个进程中进行,如果没有spawn语句,整个expect就无法再进行下去了
spawn sftp kaifatest@reports.afilias.info; =>启动expect操作进程
2、expect 是针对需要交互的地方进行自动发送消息,{ 大扣号前面必须要有空格,前面引号内的内容是交互界面等待输入的匹配字串,{} 内的是交互输入的内容:
a、send_user 等同于shell里的echo 显示用,
b、send 发送数据,最后的\r必需,说明输入密码并回车了
c、exp_continue 继续处理下一步命令
"kaifatest@reports.afilias.info's password:" {send_user $pwd;send "$pwd\r";exp_continue}
进入sftp后,需要获取所需文件并退出,因为都是在"sftp>"下面处理,所以两条命令放一起:
"sftp>" {send "get $expire_me $curdir\rquit\r";exp_continue}
expect eof =>此命令和spawn 是匹配的,spawn进程结束后会向expect发送eof,表示退出spwan
EOF 解除expect脚本执行,跳出到shell执行环境
以下是手工命令操作步骤:
[public@informix-demo ~]$ sftp kaifatest@reports.afilias.info
Connecting to reports.afilias.info...
kaifatest@reports.afilias.info's password:
sftp>