linux shell和expect自动交互混合编码

因为使用到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> 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页