ftp脚本

面给出两个范例,供大家参考
来自:http://www.chinaunix.net,/
十分感谢作者:deathcult

代码:
  
  
1, #!/bin/sh F="xxxx.ftp" echo "open 192.168.7.51 21" > $F echo "user username passwd" >> $F echo "bin" >> $F echo "cd /home/xxx/" >> $F echo "mput $1" >> $F echo "bye" >> $F ftp -i -in < $F rm -rf $F 2, #!/bin/sh FILE=$1 ftp -i -in <<! open 192.168.7.9 21 user username password cd / mput $FILE bye !
代码:
  
  
2, #建立一个文本文件,例如文件名是ftp.txt,其内容如下: open 192.168.1.100 /*用open连接远程服务器192.168.1.100*/ user MYNAME MYPASSWORD /*MYNAME是用户名,MYPASSWORD是密码*/ binary /*以二进制传送*/ hash /*当有数据传送时,显示#号*/ cd REMOTE_PATHNAME /*进入远程目标路径REMOTE_PATHNAME*/ get REMOTE_FILE LOCAL_FILE /*把远程文件REMOTE_FILE下载成本地文件LOCAL_FILE*/ put LOCAL_FILE REMOTE_FILE /*将本地文件LOCAL_FILE上传成远程文件REMOTE_FILE */ bye /*退出ftp应用*/ #执行命令: cat ftp.txt | ftp -n
3定时ftp脚本:
转自:linuxfans.org
引用:
1.编辑.netrc,增加如下一行:
machine 服务器地址 login 用户名 password 密码
2.编辑一个文件.ftp_cmd,存储ftp命令用:
代码:
       
       
lcd 本地目录 cd 远端目录 mput *.tbz bye
3.crontab -e,增加一行:
10 4 * * 0 ftp -i < .ftp_cmd


附录:
FTP的命令行格式为:
ftp -v -d -i -n -g [主机名] ,其中

-v 显示远程服务器的所有响应信息;

-n 限制ftp的自动登录,即不使用;.n etrc文件;

-d 使用调试方式;

-g 取消全局文件名。


FTP使用的内部命令如下(中括号表示可选项):

1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip

2.$ macro-ame[args]: 执行宏定义macro-name。

3.account[password]: 提供登录远程系统成功后访问系统资源所需的补充口令。

4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。

5.ascii:使用ascii类型传输方式。
6.bell:每个命令执行完毕后计算机响铃一次。

7.bin:使用二进制文件传输方式。
8.bye:退出ftp会话过程。

9.case:在使用mget时,将远程主机文件名中的大写转为小写字母。

10.cd remote-dir:进入远程主机目录。

11.cdup:进入远程主机目录的父目录。

12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。

13.close:中断与远程服务器的ftp会话(与open对应)。

14.cr:使用asscii方式传输文件时,将回车换行转换为回行。

15.delete remote-file:删除远程主机文件。

16.debug[debug-value]:设置调试方式, 显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。

17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件
18.disconnection:同close。

19.form format:将文件传输方式设置为format,缺省为file方式。

20.get remote-file[local-file]: 将远程主机的文件remote-file传至本地硬盘的local-file。

21.glob:设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行的-g参数。

22.hash:每传输1024字节,显示一个hash符号(#)。

23.help[cmd]:显示ftp内部命令cmd的帮助信息,如:help get。
24.idle[seconds]:将远程服务器的休眠计时器设为[seconds]秒。

25.image:设置二进制传输方式(同binary)。

26.lcd[dir]:将本地工作目录切换至dir。

27.ls[remote-dir][local-file]:显示远程目录remote-dir, 并存入本地文件local-file。

28.macdef macro-name:定义一个宏,遇到macdef下的空行时,宏定义结束。
29.mdelete[remote-file]:删除远程主机文件。
30.mdir remote-files local-file:与dir类似,但可指定多个远程文件,如 :mdir *.o.*.zipoutfile 。

31.mget remote-files:传输多个远程文件。

32.mkdir dir-name:在远程主机中建一目录。

33.mls remote-file local-file:同nlist,但可指定多个文件名。
34.mode[modename]:将文件传输方式设置为modename, 缺省为stream方式。
35.modtime file-name:显示远程主机文件的最后修改时间。

36.mput local-file:将多个文件传输至远程主机。

37.newer file-name: 如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件。
38.nlist[remote-dir][local-file]:显示远程主机目录的文件清单,并存入本地硬盘的local-file。
39.nmap[inpattern outpattern]:设置文件名映射机制, 使得文件传输时,文件中的某些字符相互转换, 如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3时,文件名变为a1,a2。 该命令特别适用于远程主机为非UNIX机的情况。
40.ntrans[inchars[outchars]]:设置文件名字符的翻译机制,如ntrans1R,则文件名LLL将变为RRR。

41.open host[port]:建立指定ftp服务器连接,可指定连接端口。

42.passive:进入被动传输方式。

43.prompt:设置多个文件传输时的交互提示。

44.proxy ftp-cmd:在次要控制连接中,执行一条ftp命令, 该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。
45.put local-file[remote-file]:将本地文件local-file传送至远程主机。
46.pwd:显示远程主机的当前工作目录。

47.quit:同bye,退出ftp会话。

48.quote arg1,arg2...:将参数逐字发至远程ftp服务器,如:quote syst.
49.recv remote-file[local-file]:同get。

50.reget remote-file[local-file]:类似于get, 但若local-file存在,则从上次传输中断处续传。

51.rhelp[cmd-name]:请求获得远程主机的帮助。

52.rstatus[file-name]:若未指定文件名,则显示远程主机的状态, 否则显示文件状态。

53.rename[from][to]:更改远程主机文件名。

54.reset:清除回答队列。

55.restart marker:从指定的标志marker处,重新开始get或put,如:restart 130。
56.rmdir dir-name:删除远程主机目录。

57.runique:设置文件名只一性存储,若文件存在,则在原文件后加后缀.1, .2等。

58.send local-file[remote-file]:同put。

59.sendport:设置PORT命令的使用。

60.site arg1,arg2...:将参数作为SITE命令逐字发送至远程ftp主机。

61.size file-name:显示远程主机文件大小,如:site idle 7200。

62.status:显示当前ftp状态。

63.struct[struct-name]:将文件传输结构设置为struct-name, 缺省时使用stream结构。

64.sunique:将远程主机文件名存储设置为只一(与runique对应)。

65.system:显示远程主机的操作系统类型。

66.tenex:将文件传输类型设置为TENEX机的所需的类型。

67.tick:设置传输时的字节计数器。

68.trace:设置包跟踪。

69.type[type-name]:设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。

70.umask[newmask]:将远程服务器的缺省umask设置为newmask,如:umask 3

71.user user-name[password][account]:向远程主机表明自己的身份,需要口令时,必须输入口令,如:user anonymous my@email。
72.verbose:同命令行的-v参数,即设置详尽报告方式,ftp 服务器的所有响 应都将显示给用户,缺省为on.

73.?[cmd]:同help.

 
自动ftp脚本(全参数版)

[code]#!/bin/sh
#==================================================================
#*
#* Copyright (c) 2005, dinner3000
#* All rights reserved.
#*
#* 文件名称:auto_trans.sh
#* 文件标识:
#* 摘    要:自动ftp脚本(全参数版)
#* 作    者:dinner3000
#* 修 改 者:
#* 修改内容:
#* 修改时间:
#* 版    本:2005-5-12
#* $Id$
#*
#==================================================================
#local variable
PS_FULLNAME=`basename ${0}`  #脚本全名
PS_EXT=`echo ${PS_FULLNAME} |awk -F"." '{if(index($0,".")==0){printf("");}else{printf("%s",$NF)}}'` #脚本扩展名
PS_NAME=`echo ${PS_FULLNAME} |sed "s/.${PS_EXT}//g"` #脚本名称

PS_DIR=`dirname ${0}`
TMP_STR=`echo ${PS_DIR} |awk -F"/" '{printf("%s",$1);}'`
if [ -z ${TMP_STR} ]; then
ABS_PATH=${PS_DIR}
else
cd ${PS_DIR}
ABS_PATH=`pwd`
fi
WORK_DIR=${ABS_PATH} #脚本所在绝对路径
LOCAL_DIR=`pwd`  #初始化FTP本地目录

#remote variable
REMOTE_IP="127.0.0.1" #初始化FTP主机地址
USER="Anomymous"  #初始化FTP帐号
PSWD="Anonymous@sina.com" #初始化FTP密码
REMOTE_DIR="/"   #初始化FTP远端目录
BACKUP_DIR="undefined" #初始化文件备份目录
FILE_TYPE="*.*"   #初始化要传送的文件类型
FILE_LIST="undefined" #初始化要传送的文件列表
METHOD="undefined"  #初始化FTP传送方向
CONN_MODE="passive off" #初始化FTP连接模式
TRAN_MODE="binary"  #初始化FTP传送模式
CLEAN="false"   #是否清除传送成功的文件

#log path
RUN_LOG="${WORK_DIR}/${PS_NAME}_run.log" #脚本运行记录
TRANSFER_LOG="${WORK_DIR}/${PS_NAME}_transfer.log" #FTP传送临时记录

#-----------------------------------------------------------
loglite(){ #不换行记录
echo -n "${1}" >> ${RUN_LOG} 2>&1
}

log(){ 换行记录
echo "${1}" >> ${RUN_LOG} 2>&1
}

quit(){ #正常退出
log "===E==N==D=====`date`=====E==N==D==="
rm -f ${PS_LOCK}
exit
}

error(){ #非法退出
echo "${1}" 2>&1
log "${1}"
quit
}

#============================================================
while getopts :UCDPAh:u:p:r:l:b:t:f: OPTION  #分析执行参数
do
case ${OPTION} in
h) #FTP主机地址
   REMOTE_IP=${OPTARG}
   ;;
u) #FTP帐号
   USER=${OPTARG}
   ;;
p) #FTP密码
   PSWD=${OPTARG}
   ;;
r) #FTP远端目录
   REMOTE_DIR=${OPTARG}
   ;;
l) #FTP本地目录
   LOCAL_DIR=${OPTARG}
   ;;
b) #文件备份目录
   BACKUP_DIR=${OPTARG}
   ;;
t) #要传送的文件类型
   FILE_TYPE=${OPTARG}
   ;;
f) #要传送的文件列表
   FILE_LIST=${OPTARG}
   ;;
U) #FTP传送方向(上传)
   METHOD="upload"
   ;;
D) #FTP传送方向(下载)
   METHOD="download"
   ;;
P) #FTP连接模式
   CONN_MODE="passive on"
   ;;
A) #FTP传送模式
   TRAN_MODE="ascii"
   ;;
C) #清除传送成功的文件
   CLEAN="true"
   ;;
/?)#show usage
   error "${PS_FULLNAME} -[U(pload) D(ownload)] -[C(lean)] -[P(assive)] -[A(scii)] -[h host] -[u user] -[p password] -[r remote path] -[l local path] -[b backup path] -[t filetype] -[f file list]."
   ;;
esac
done

PS_LOCK="${WORK_DIR}/${PS_NAME}_`echo "${USER}:${PSWD}@${REMOTE_IP}${REMOTE_DIR} => ${LOCAL_DIR}" |md5`.pid" #进程互斥锁, 只有参数完全相同才会互斥

if [ ${METHOD} = "undefined" ]; then #FTP传送方向未定义错
error "Tansfer mode(-[U(pload) D(ownload)]) must be set.(1)"
fi

#-------------------------------------------------------------
#init run log
log ""
log "###############`date`################"
log "REMOTE: ${USER}:${PSWD}@${REMOTE_IP}${REMOTE_DIR}"
log "LOCAL: ${LOCAL_DIR}"
log "METHOD: ${METHOD}"
log "FILE_TYPE: ${FILE_TYPE}"
log "WORK_DIR: ${WORK_DIR}"
log "PS_LOCK: ${PS_LOCK}"
log "RUN_LOG: ${RUN_LOG}"
log "TRANSFER_LOG: ${TRANSFER_LOG}"
log "###########################################################"
log ""

if [ -f ${PS_LOCK} ]; then  #进程互斥
echo "`date`: ${PS_FULLNAME} already running. Exit." 2>&1
log "`date`: ${PS_FULLNAME} already running. Exit." 2>&1
exit
else
ps auxw |grep /bin/sh |grep ${PS_FULLNAME} |grep -v grep > ${PS_LOCK}
fi

#-----------------------------------------------------------
#create file list
if [ ${METHOD} = "upload" ]; then
if [ ${FILE_LIST} = "undefined" ]; then
  BATCH_OPT="mput ${FILE_TYPE}"
else
  BATCH_OPT=`sed 's/^/put /g' ${FILE_LIST}`
  rm -f ${FILE_LIST}
fi
elif [ ${METHOD} = "download" ]; then
if [ ${FILE_LIST} = "undefined" ]; then
  BATCH_OPT="mget ${FILE_TYPE}"
else
  BATCH_OPT=`sed 's/^/get /g' ${FILE_LIST}`
  rm -f ${FILE_LIST}
fi
else
error "Tansfer mode(-[U(pload) D(ownload)]) must be set.(2)"
fi

#transfer files
cd ${WORK_DIR}
#excute ftp batch
echo "
open ${REMOTE_IP}
prompt off
user ${USER} ${PSWD}
lcd ${LOCAL_DIR}
cd ${REMOTE_DIR}
${CONN_MODE}
${TRAN_MODE}
${BATCH_OPT}
close
bye
" |ftp -v -n |tee ${TRANSFER_LOG} |sed 's/^/>/g' >> ${RUN_LOG}  #执行批量传送, 并记录日志
TOTAL_TRANSFERED=`grep "226 Transfer complete" ${TRANSFER_LOG} |wc -l` #统计传送数量
log "TOTAL TRANSFERED: ${TOTAL_TRANSFERED}"
log ""

#clear or backup files
if [ ${METHOD} = "upload" ]; then
if [ ${BACKUP_DIR} != "undefined" ]; then #备份已上传的文件
  log "Backup up files ... "
  COUNT=0
  BATCH_BKUP=`grep -B 3 "226 Transfer complete." ${TRANSFER_LOG} |grep "local:" |awk -F" " '{printf("%s/n",$2);}'`
  cd ${LOCAL_DIR}
  for I in ${BATCH_BKUP}
  do
   mv -v ${I} ${BACKUP_DIR}/ |sed 's/^/>/g' >> ${RUN_LOG} 2>&1
   COUNT=`expr ${COUNT} + 1`
  done
  log "TOTAL BACKUPED: ${COUNT}"
  log ""
else
  if [ ${CLEAN} = "true" ]; then  #清除已上传的文件
   log "Remove transfered files ... "
   COUNT=0
   BATCH_CLEAN=`grep -B 3 "226 Transfer complete." ${TRANSFER_LOG} |grep "local:" |awk -F" " '{printf("%s/n",$2);}'`
   log "Execute local clear(${LOCAL_DIR}) ... "
   cd ${LOCAL_DIR}
   for I in ${BATCH_CLEAN}
   do
    rm -fv ${I} |sed 's/$/ deleted./g' >> ${RUN_LOG} 2>&1
    COUNT=`expr ${COUNT} + 1`
   done
   log "TOTAL DELETED: ${COUNT}"
   log ""
  fi
fi
elif [ ${METHOD} = "download" ]; then
if [ ${CLEAN} = "true" ]; then  #清除已下载的文件
  log "Execute remote clear ... "
  BATCH_CLEAN=`grep -B 3 "226 Transfer complete." ${TRANSFER_LOG} |grep "local:" |awk -F" " '{printf("delete %s/n",$2);}'`
  echo "
  open ${REMOTE_IP}
  prompt off
  user ${USER} ${PSWD}
  lcd ${LOCAL_DIR}
  cd ${REMOTE_DIR}
  ${BATCH_CLEAN}
  close
  bye
  " |ftp -v -n |tee ${TRANSFER_LOG} |sed 's/^/>/g' >> ${RUN_LOG} 2>&1
  COUNT=`grep "250 DELE command successful." ${TRANSFER_LOG} |wc -l`
  log "TOTAL DELETED: ${COUNT}"
  log ""
fi
else
error "Tansfer mode(-[U(pload) D(ownload)]) must be set.(3)"
fi

quit  #正常退出

#========================================================

调用方法:
auto_trans.sh
-[U(pload) D(ownload)]
  传送方向, 上传或下载, 必须指定, 且只能指定其一
-[C(lean)]
  清除已传送的文件(默认不清除)
-[P(assive)]
  被动模式(默认主动)
-[A(scii)]
  文本模式(默认二进制)
-[h host]
  主机地址(默认127.0.0.1)
-[u user]
  帐号(默认匿名)
-[p password]
  密码(默认匿名)
-[r remote path]
  远端路径(默认根目录)
-[l local path]
  本地路径(默认当前目录)
-[b backup path]
  文件备份目录(默认不备份)
-[t filetype]
  要传送的文件类型(默认*.*)
-[f file list]
  要传送的文件列表(默认无)[/code]
 
还有些地方不明白,又搜了一篇文章:
 

自动ftp,上班第一年就研究过了。截获了一个自动ftp脚本。

ftp -n <<!
open 10.10.10.10
user USERNAME PASSWD
bin
prom
mput *.tar.gz
mget *.tar
by

就是没有仔细研究,一切都是照搬。结果今天仔细寻思一下-n的含义,<<的含义,和!的含义。 其中一个给我整迷糊了。

-n 不受.netrc文件的影响(ftp默认为读取.netrc文件中的设定)
<< 是使用即时文件重定向输入,
!是即时文件的标志它必须成对出现,以标识即时文件的开始和结尾。(你也可以不用“!”,比如使用一对“PUT”等也是可以的)
即时文件是UNIX输入重定向的一种技术,本来输入重定向要求从文件中读取内容,但即时文件可以把程序所需输入内容的内容直接写出来,就是你在上面例子中看到的那样。

 

根据上面的点,我找到了有针对性的事情干

ORACLE自动备份并且自动FTP到备份机的SHELL脚本

创建:2005-10-27 16:18:20
作者:Unlinux
来自: http://www.Unlinux.com

本次上传的脚本有很多可以改进的地方!这也是本人第一次在网上发帖,SH写的不好的地方
不要见笑!!!!!!本SH以在SCO OPENSERVER 505(ORACLE 7.3.2)和IBM RS6000 AIX 4.3(ORACLE 8.1.6)调试通过!!如果要转载,请加上出处!!!谢谢!!!详细功能见脚本文件SH的批注!!!如果能要加上自动执行的功能请使用crontab配置即可!!!!

第一个文件:INIT.TXT这是脚本INI初始化文件:
##################################################################
#This is a system ini file :
# CopyRight By WangZuXiang 2002
# the '#' is ingnor :
#the format style is xxxx=value
#
##################################################################

#Oracle cionfig
[oracle]
username=ydyx
password=ydyx
con_alias=MISDB

#the main machine config
[mainhost]
myhost_ip=10.232.193.2
myhost_username=oracle
myhost_password=oracle
dump_dir=/u2/oracleback

#the backup machine config
[backuphost]
backhost_ip=10.232.193.5
backhost_username=oracle
backhost_password=oracleydyx
backup_dir=/u2/oracleshaoshanback

#delete the dump file x days ago?!!!
[deletedumpfile]
delete_days=2

#the Oracle database's back method
#如果start_tactic=Y 则采用策略备份,否则按每天完全到出
#如果采用策略备份,则必须给SYSTEM用户的口令
[backmethod]
start_tactic=N
system_password=manager11

#the recode the system execute's log!
[systemlog]
sys_log=/home/oracle/wzx/x.log
#end

第二个文件:主程序文件:MY.SH:
#!/bin/sh
#############################################################################
#
#Get the all ini file config
#CopyRight By WangZuXiang 2002-2005?
#版权所有(C) 2002-2005? WangZuXiang .
#All Rights Reserved.
#program date 2002-10-22
#usage: main
#This script is used to start oracle dump database .
#It should ONLY be executed as part of the crontabs.
#function content is:
#1:自动检查是否能连上Oracle!
#2:通过初始化文本来解析各种需要的参数!
#3:自动完全到出ORACLE数据库(每天)!,以后将增加相关的增量备份等!
#4:自动删除配置文件中规定的前X天的备份文件!
#5:自动将到出文件打包并转存到其他的备份机器上!
#6:自动记录程序执行过程中的所有日期信息!
#if you find some bugs please send it to my mailpost :
#e-mail:wzxherry@sina.com !
#new function:增加了对ORACLE数据库备份策略的方法!2002-10-31
##############################################################################
mypwd=`pwd`
inifile=/home/oracle/wzx/init.txt
oratab=/etc/oratab
TEMP=temp.$$
DUMP_FILE=`date +'%Y%m%d`

initme ()
{
#read from the config file 'ini.txt'

#oracle config
USERNAME=`cat ${inifile:-"init.txt"} | grep -i '^username' | awk -F = '{print $2}'`
PASSWORD=`cat ${inifile:-"init.txt"} | grep -i '^password' | awk -F = '{print $2}'`
MY_ALIAS=`cat ${inifile:-"init.txt"} | grep -i '^con_alias' | awk -F = '{print $2}'`

#the main host config
MYHOST_IP=`cat ${inifile:-"init.txt"} | grep -i '^myhost_ip' | awk -F = '{print $2}'`
MYHOST_USERNAME=`cat ${inifile:-"init.txt"} | grep -i '^myhost_username' | awk -F = '{print $2}'`
MYHOST_PASSWORD=`cat ${inifile:-"init.txt"} | grep -i '^myhost_password' | awk -F = '{print $2}'`
DUMP_DIR=`cat ${inifile:-"init.txt"} | grep -i '^dump_dir' | awk -F = '{print $2}'`

#the backup host config
BACKHOST_IP=`cat ${inifile:-"init.txt"} | grep -i '^backhost_ip' | awk -F = '{print $2}'`
BACKHOST_USERNAME=`cat ${inifile:-"init.txt"} | grep -i '^backhost_username' | awk -F = '{print $2}'`
BACKHOST_PASSWORD=`cat ${inifile:-"init.txt"} | grep -i '^backhost_password' | awk -F = '{print $2}'`
BACKUP_DIR=`cat ${inifile:-"init.txt"} | grep -i '^backup_dir' | awk -F = '{print $2}'`

#the define's delete dump file days!
DAYS=`cat ${inifile:-"init.txt"} | grep -i '^delete_days' | awk -F = '{print $2}'`
#to get the system log
LOGS=`cat ${inifile:-"init.txt"} | grep -i '^sys_log' | awk -F = '{print $2}'`
TACTIC=`cat ${inifile:-"init.txt"} | grep -i '^start_tactic' | awk -F = '{print $2}'`
SYSTEMPASS=`cat ${inifile:-"init.txt"} | grep -i '^system_password' | awk -F = '{print $2}'`

#read the config file end.
}

#WHOAMI=`id | awk '/uid=[0-9]*(oracle)/ {print $1}'`
#WHOAMI=`id | awk '{print $1}' | sed 's/uid=[0-9]*(.*).*/1/'`
WHOAMI=`id | sed 's/uid=[0-9]*(.*) gid.*/1/'`
#if test "$WHOAMI" = "" ; then
if test "$WHOAMI" != "(oracle)" ; then
echo "

"
echo "=============================================================="
echo "=========you must use oracle user to run this script!========="
echo "=============================================================="
echo "

"
exit 0
fi

#run the init parameter
test ! -e $inifile && echo "not find the init file:"$inifile"!" && exit 0

initme

if [ -z $LOGS ]; then
echo "<<can not to find the define of system log...!!!>>"
fi

#LOG = ${LOGS:-"x.log"}
LOGME="tee -a ${LOGS:-"x.log"}"

if [ -e $LOGS -a -f $LOGS ]; then
if test ! -w $LOGS; then
echo "<<the log file:"$LOGS" can not to write!....................>>"
exit
fi
fi

echo "

" | $LOGME
echo "-----------------------------------------------------------------" | $LOGME
echo "<<system now is initing ..............!>>" | $LOGME

#check the parameter value
if [ -z $USERNAME ]; then
echo "<<the oracle database's username is null..............!>>" | $LOGME
exit 1
fi

if [ -z $PASSWORD ]; then
echo "<<the oracle database's password is null..............!>>" | $LOGME
exit 2
fi

if [ -z $MY_ALIAS ]; then
echo "<the oracle connect alias is null!..............>>" | $LOGME
exit 0
fi

if [ -z $MYHOST_IP ]; then
echo "<<the oracle's host ip is null..............!>>" | $LOGME
exit 3
fi

if [ ! -d $DUMP_DIR ]; then
echo "<the oracle's dump dir is not exist..............!>>" | $LOGME
exit 0
fi

if [ -z $MYHOST_USERNAME ]; then
echo "<<then oracle host username is null..............!>>" | $LOGME
exit 4
fi

if [ -z $MYHOST_PASSWORD ]; then
echo "<<the oracle host password is null..............!>>" | $LOGME
exit 5
fi

if [ -z $BACKHOST_IP ]; then
echo "<<the backup host's ip is null..............!>>" | $LOGME
exit 6
fi

if [ -z $BACKHOST_USERNAME ]; then
echo "<<the backup host's uesername is null..............!>>" | $LOGME
exit 7
fi

if [ -z $BACKHOST_PASSWORD ]; then
echo "<<the backup host's password is null..............!>>" | $LOGME
exit 8
fi

if [ -z $BACKUP_DIR ]; then
echo "<<the backup host's backup dir is null..............!>>" | $LOGME
exit 9
fi
#elif [ ! -e $BACKUP_DIR -o ! -d $BACKUP_DIR ]; then
#echo "<<the backup dir "$BACKUP_DIR" is not exist or is not directory..............!>>" | $LOGME
#exit 0
#fi

#if [ ! -O $BACKUP_DIR ]; then
#echo "<<the backup host's backup dir is not owner to oracle..............!>>" | $LOGME
#exit 0
#fi

if [ -z $DAYS ]; then
echo "<<the delete file define days is null so not to delete...............!>>" | $LOGME
fi

if test $TACTIC = "Y" ; then
if test -z $SYSTEMPASS ; then
echo "<<if you use TACTIC back,then you must give the oracle system password!...............!>>" | $LOGME
exit 0
fi
fi

if test $? -eq 0 ; then
echo "<<system init is OK............................!>>" | $LOGME
fi

#check end.
#
#main
#

if [ ! -f $oratab -o ! -e $oratab ]; then
echo "<<the oracle define's oratab file is not normal file or is not exist..............!>>" | $LOGME
exit 0
fi

ORACLE_SID=`cat $oratab | grep -v "^#" | grep "Y$" | awk -F : '{print $1}' `
if [ -z $ORACLE_SID ]; then
echo "<<the ORACLE_SID is not find ..............!>>" | $LOGME
exit -1
fi
export ORACLE_SID
ORACLE_HOME=`cat $oratab | grep -v "^#" | grep "Y$" | awk -F : '{print $2}' `
if [ ! -d $ORACLE_HOME ]; then
echo "the oracle's home directory "$ORACLE_HOME" is not exist..............!>>" | $LOGME
exit -1
fi
export ORACLE_HOME
PATH=$PATH:$ORACLE_HOME/bin:/usr/lib:/bin:$HOME/bin:.
ORACLE_BASE=/u1/app/oracle
export ORACLE_BASE
ORACLE_SID=misdb
export ORACLE_SID
ORACLE_HOME=$ORACLE_BASE/product/8.1.6
export ORACLE_HOME
PATH=$PATH:$ORACLE_HOME/bin
export PATH
LIBPATH=$LIBPATH:$ORACLE_HOME/lib
export LIBPATH
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export ORA_NLS33
export PATH
#############################################
## begin to dump the database
#############################################

#trying to connect oracle .....
if [ -e $TEMP ]; then
rm -f $TEMP
if [ ! $? -eq 0 ]; then
echo "<<delete the file: "$TEMP" is fail..............!!!!>>" | $LOGME
exit -1
fi
fi

if [ -x $ORACLE_HOME/bin/tnsping ]; then
#$ORACLE_HOME/bin/tnsping $MY_ALIAS > $TEMP
tnsping $MY_ALIAS > $TEMP
ME=`cat $TEMP | grep "OK" | awk '{print $1}'`
if [ "$ME" != "OK" ]; then
echo "<<can not to connect oracle by tnsping:"$MY_ALIAS"..............!>>" | $LOGME
rm -f $TEMP
exit $?
else
echo "<<connect oracle is ok!...............................!>>" | $LOGME
fi
fi

rm -f $TEMP

if [ -x $ORACLE_HOME/bin/exp ]; then
#MY_ALIAS
#cd $ORACLE_HOME/bin
#if [ ! $? -eq 0 ]; then
#echo "error
"
#exit 0
#fi

trap "" 1 2 3 15

#如果不用策略备份,则采用倒用户的方式,到出!!!!
#echo $TACTIC
#
#if [ "$TACTIC" = "Y" ]; then
#if [ -x $ORACLE_HOME/bin/svrmgrl ]; then
#svrmgrl <<EOF
#connect $USERNAME/$SYSTEMPASS@$MY_ALIAS
#exit
#EOF
#if test $? -ne 0 ; then
#echo "<<SYSTEM user password is error!.................>>" | $LOGME
#exit $?
#fi
#fi
#fi
#

if [ "$TACTIC" != "Y" -o "$TACTIC" != "y" ]; then
echo "<<系统将按倒出用户方式进行!..............................>>" | $LOGME
$ORACLE_HOME/bin/exp $USERNAME/$PASSWORD@$MY_ALIAS buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp owner=$USERNAME grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log

#采用策略备份,则对整个数据库进行策略备份!

else
echo "<<系统将按策略备份用户方式进行!..............................>>" | $LOGME
MYWEEK=`date | awk '{print $1}'`
case $MYWEEK in
#星期一完全导出
Mon)exp system/$SYSTEMPASS@$MY_ALIAS inctype=complete buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log
echo "<<Mon is complete dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME
;;
#星期二增量导出
Tue)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log
echo "<<Tue is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME
;;
#星期三增量导出
Wed)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log
echo "<<Wed is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME
;;
#星期四增量导出
Thu)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log
echo "<<Thu is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME
;;
#星期五累计导出
Fri)exp system/$SYSTEMPASS@$MY_ALIAS inctype=cumulative buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log
echo "<<Fri is cumulative dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME
;;
#星期六增量导出
Sat)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log
echo "<<Sat is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME
;;
#星期日增量导出
Sun)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log
echo "<<Sun is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME
;;
*)
;;
esac
fi

if test $? -eq 0 -a -s $DUMP_DIR/$DUMP_FILE.dmp
then
echo "<<dump the oracle database success at: "$DUMP_FILE"..............!>>" | $LOGME
else
echo "<<dump the oracle database fail at: "$DUMP_FILE"..............!>>" | $LOGME
exit $?
fi
else
echo "<<sorry!,the exp not to find or not execute,please check it..............!>>" | $LOGME
exit $?
fi

#其实可以用find . -atime -days -exec rm {} 删除前DAYS天的备份文件,但查找不是很精确!
#if define the days then to execute delete the dump file $DAYS ago!
if [ -n $DAYS -a $DAYS -gt 0 ]; then
echo "<<system will to remove the dump file $DAYS days ago..............!>>" | $LOGME
if [ -x $ORACLE_HOME/bin/svrmgrl ]; then
svrmgrl <<EOF
connect $USERNAME/$PASSWORD@$MY_ALIAS
spool $TEMP
select to_char(sysdate-$DAYS,'yyyymmdd') mydate from dual;
spool off
exit
EOF
if test $? -eq 0 -a -f $TEMP -a -s $TEMP ; then
echo "<<get the $DAYS days ago's date is ok..............!>>" | $LOGME
else
echo "<<to get $DAYS days ago's date is fail(connect oracle is fail---------)..............!>>" | $LOGME
#exit $?
fi
else
echo "<<not find the oracle's svrmgrl program or cant not execute and get the days is fail..............!>>" | $LOGME
exit $?
fi

#####################
##
## Gegin to remove the dump file
##
#####################

#TEMPDATE=`cat $TEMP | sed '1d' | sed '$d' | grep -v '^--*'`
TEMPDATE=`cat $TEMP | sed '1d' | sed '$d' | sed '/^--*/d'`
#echo "$TEMPDATE"
rm -f $TEMP
if test ! $? -eq 0 ; then
echo "<<can not to remove the temp file:"$TEMP"..............!>>" | $LOGME
fi
#echo "${DUMP_DIR}/${TEMPDATE}.dmp"
if test -e $DUMP_DIR/$TEMPDATE.dmp -a -f $DUMP_DIR/$TEMPDATE.dmp -a -n $TEMPDATE; then
rm -f $DUMP_DIR/$TEMPDATE.dmp
rm -f $DUMP_DIR/$TEMPDATE.log
rm -f $DUMP_DIR/$TEMPDATE.tar.Z
if test $? -eq 0 ; then
echo "<<remove the "$DUMP_DIR/$TEMPDATE.dmp" is ok..............!>>" | $LOGME
else
echo "<<remove the "$DUMP_DIR/$TEMPDATE.dmp" is fail..............!>>" | $LOGME
#exit $?
fi
else
echo "<<can not to find the file: "$DUMP_DIR/$TEMPDATE.dmp" ..............!>>" |
$LOGME
#exit $?
fi
fi

####################################################
#
#to transfer the dump file to other's host user ftp
#
####################################################

if [ -e $DUMP_DIR/$DUMP_FILE.dmp -a -e $DUMP_DIR/$DUMP_FILE.log ]; then
tar -cvf $DUMP_DIR/$DUMP_FILE.tar $DUMP_DIR/$DUMP_FILE.dmp $DUMP_DIR/$DUMP_FILE.log && compress $DUMP_DIR/$DUMP_FILE.tar | $LOGME
if test $? -eq 0 -a -e $DUMP_DIR/$DUMP_FILE.tar.Z ; then
echo "<<the dump file "$DUMP_FILE.tar.Z" is archive ok.........!>>" | $LOGME
rm -f $DUMP_DIR/$DUMP_FILE.tar
rm -f $DUMP_DIR/$DUMP_FILE.log
rm -f $DUMP_DIR/$DUMP_FILE.dmp
if test ! $? -eq 0 ; then
echo "<<delete the dump file is fail!.........................!>>" | $LOGME
else
echo "<<delete the dump file is ok!.........................!>>" | $LOGME
fi
else
echo "<<the dump file "$DUMP_FILE.tar.Z" is archive fail..........!>>" | $LOGME
exit $?
fi
fi

echo "<<system now is transfering file to ${BACKHOST_IP}..............!>>" | $LOGME

ftp -n $BACKHOST_IP <<! | $LOGME
user $BACKHOST_USERNAME $BACKHOST_PASSWORD
bin
prompt
put $DUMP_DIR/$DUMP_FILE.tar.Z $BACKUP_DIR/$DUMP_FILE.tar.Z
close
bye
!

if test $? -eq 0 ; then
echo "<<Transfer the file:"$DUMP_DIR/$DUMP_FILE.tar.Z" to "$BACKHOST_IP"$BACKUP_DIR is OK.................! >>" | $LOGME
else
echo "<<Transfer the file:"$DUMP_DIR/$DUMP_FILE.tar.Z" to "$BACKHOST_IP"$BACKUP_DIR is fail..................! >>" | $LOGME
exit $?
fi

if test $? -eq 0 ; then
echo "<<the script is execute finish!,please check it!.......................................!>>" | $LOGME
echo "-----------------------------------------------------------------" | $LOGME
exit 0
fi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值