作者:绿林VS逍遥 | 来源:互联网 | 2023-01-08 21:37
目标为实现每天定时从其他服务器上复制文件到本地,需要使用crontab建立定时任务,并通过scp进行Linux之间的文件复制。在复制文件时,可能需要输入目标服务器上的密码,通过expect
目标
为实现每天定时从其他服务器上复制文件到本地,需要使用crontab建立定时任务,并通过scp进行Linux之间的文件复制。在复制文件时,可能需要输入目标服务器上的密码,通过expect即可实现。
步骤说明
准备工作
检查并安装expect及tcl
说明:expect命令行工具,可在交互式操作的场景下实现复杂的自动化处理功能。expect依赖tcl。
> cd unix
> ./configure
> make
> make install
> ./configure --with-tclinclude=/usr/src/tcl8.4.19/generic/ --with-tclcOnfig=/usr/local/lib/
> make
> make install
> expect
expect1.1>
编写处理脚本
实现功能:在远程数据库上执行expdp导出dmp文件,并复制到本地指定位置。因每天都会执行,需要生成有日期后缀的文件。
#!/bin/bash
curr_date=$(date '+%y%m%d')
echo $curr_date
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1/
/home/.../bin/expdp olduser/password@10.0.1.1/orcl directory=DATA_PUMP_DIR dumpfile=expdb_${curr_date}.dmp logfile=expdb${curr_date}.log SCHEMAS=olduser
/usr/local/bin/expect <10.0.1.1:/u01/app/oracle/dpdump/expdb_${curr_date}.dmp /home/oracle/dbbackup/
set timeout 300
expect "oracle@10.0.1.1's password:"
set timeout 300
send "password\r"
set timeout 3600
send "exit\r"
expect eof
!
保存以上文件为bakbash(假设位于:/usr/local/bin/目录),然后用chmod命令设置可执行权限:
chmod 755 bakbash
创建定时任务
crontab -l
crontab -e
0 2 * * * /usr/local/bin/bakbash
su -root password
/etc/init.d/crond restart
至此,即完成了任务配置及脚本自动处理。
总结
- 在/bin/bash中使用expect,可采用如下方式:
#!/bin/bash
expect <## expect命令 ##
!
- Crontab 编辑后,并不需要restart。
- 报错信息:/bin/sh: bakbash: command not found,这是因为之前将bakbash脚本放在了其他目录下,导致bash脚本无法找到该命令,将文件转移到/usr/local/bin/目录后,即可找到。另外,在bakbash中使用到的 expdp, expect命令,都需要有明确的路径前缀,否则也会找不到命令。这是因为crontab在执行的时候只会定义少数环境变量而不是继承用户shell环境中的环境变量。
延伸阅读
关于expect命令的介绍,参见:
http://os.51cto.com/art/201012/240260.htm
http://blog.csdn.net/qujinhua19851006/article/details/8666324
关于Linux之间的数据传输方式(rcp/scp等)及比较,参见:
http://blog.csdn.net/qujinhua19851006/article/details/8666254