免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8467 | 回复: 10
打印 上一主题 下一主题

[原创]自动ftp脚本(全参数版) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-27 23:40 |只看该作者 |倒序浏览
  1. #!/bin/sh
  2. #==================================================================
  3. #*
  4. #* Copyleft, dinner3000
  5. #* All rights give up.
  6. #*
  7. #* 文件名称:auto_trans.sh
  8. #* 文件标识:
  9. #* 摘    要:自动ftp脚本(全参数版)
  10. #* 作    者:dinner3000
  11. #* 修 改 者:
  12. #* 修改内容:
  13. #* 修改时间:
  14. #* 版    本:2005-5-12
  15. #* $Id$
  16. #*
  17. #==================================================================
  18. #local variable
  19. PS_FULLNAME=`basename ${0}`  #脚本全名
  20. PS_EXT=`echo ${PS_FULLNAME} |awk -F"." '{if(index($0,".")==0){printf("");}else{printf("%s",$NF)}}'` #脚本扩展名
  21. PS_NAME=`echo ${PS_FULLNAME} |sed "s/.${PS_EXT}//g"` #脚本名称

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

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

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

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

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

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

  59. error(){ #非法退出
  60. echo "${1}" 2>&1
  61. log "${1}"
  62. quit
  63. }

  64. #============================================================
  65. while getopts :UCDPAh:u:p:r:l:b:t:f: OPTION  #分析执行参数
  66. do
  67. case ${OPTION} in
  68. h) #FTP主机地址
  69.    REMOTE_IP=${OPTARG}
  70.    ;;
  71. u) #FTP帐号
  72.    USER=${OPTARG}
  73.    ;;
  74. p) #FTP密码
  75.    PSWD=${OPTARG}
  76.    ;;
  77. r) #FTP远端目录
  78.    REMOTE_DIR=${OPTARG}
  79.    ;;
  80. l) #FTP本地目录
  81.    LOCAL_DIR=${OPTARG}
  82.    ;;
  83. b) #文件备份目录
  84.    BACKUP_DIR=${OPTARG}
  85.    ;;
  86. t) #要传送的文件类型
  87.    FILE_TYPE=${OPTARG}
  88.    ;;
  89. f) #要传送的文件列表
  90.    FILE_LIST=${OPTARG}
  91.    ;;
  92. U) #FTP传送方向(上传)
  93.    METHOD="upload"
  94.    ;;
  95. D) #FTP传送方向(下载)
  96.    METHOD="download"
  97.    ;;
  98. P) #FTP连接模式
  99.    CONN_MODE="passive on"
  100.    ;;
  101. A) #FTP传送模式
  102.    TRAN_MODE="ascii"
  103.    ;;
  104. C) #清除传送成功的文件
  105.    CLEAN="true"
  106.    ;;
  107. \?)#show usage
  108.    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]."
  109.    ;;
  110. esac
  111. done

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

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

  116. #-------------------------------------------------------------
  117. #init run log
  118. log ""
  119. log "###############`date`################"
  120. log "REMOTE: ${USER}:${PSWD}@${REMOTE_IP}${REMOTE_DIR}"
  121. log "LOCAL: ${LOCAL_DIR}"
  122. log "METHOD: ${METHOD}"
  123. log "FILE_TYPE: ${FILE_TYPE}"
  124. log "WORK_DIR: ${WORK_DIR}"
  125. log "PS_LOCK: ${PS_LOCK}"
  126. log "RUN_LOG: ${RUN_LOG}"
  127. log "TRANSFER_LOG: ${TRANSFER_LOG}"
  128. log "###########################################################"
  129. log ""

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

  137. #-----------------------------------------------------------
  138. #create file list
  139. if [ ${METHOD} = "upload" ]; then
  140. if [ ${FILE_LIST} = "undefined" ]; then
  141.   BATCH_OPT="mput ${FILE_TYPE}"
  142. else
  143.   BATCH_OPT=`sed 's/^/put /g' ${FILE_LIST}`
  144.   rm -f ${FILE_LIST}
  145. fi
  146. elif [ ${METHOD} = "download" ]; then
  147. if [ ${FILE_LIST} = "undefined" ]; then
  148.   BATCH_OPT="mget ${FILE_TYPE}"
  149. else
  150.   BATCH_OPT=`sed 's/^/get /g' ${FILE_LIST}`
  151.   rm -f ${FILE_LIST}
  152. fi
  153. else
  154. error "Tansfer mode(-[U(pload) D(ownload)]) must be set.(2)"
  155. fi

  156. #transfer files
  157. cd ${WORK_DIR}
  158. #excute ftp batch
  159. echo "
  160. open ${REMOTE_IP}
  161. prompt off
  162. user ${USER} ${PSWD}
  163. lcd ${LOCAL_DIR}
  164. cd ${REMOTE_DIR}
  165. ${CONN_MODE}
  166. ${TRAN_MODE}
  167. ${BATCH_OPT}
  168. close
  169. bye
  170. " |ftp -v -n |tee ${TRANSFER_LOG} |sed 's/^/>/g' >> ${RUN_LOG}  #执行批量传送, 并记录日志
  171. TOTAL_TRANSFERED=`grep "226 Transfer complete" ${TRANSFER_LOG} |wc -l` #统计传送数量
  172. log "TOTAL TRANSFERED: ${TOTAL_TRANSFERED}"
  173. log ""

  174. #clear or backup files
  175. if [ ${METHOD} = "upload" ]; then
  176. if [ ${BACKUP_DIR} != "undefined" ]; then #备份已上传的文件
  177.   log "Backup up files ... "
  178.   COUNT=0
  179.   BATCH_BKUP=`grep -B 3 "226 Transfer complete." ${TRANSFER_LOG} |grep "local:" |awk -F" " '{printf("%s\n",$2);}'`
  180.   cd ${LOCAL_DIR}
  181.   for I in ${BATCH_BKUP}
  182.   do
  183.    mv -v ${I} ${BACKUP_DIR}/ |sed 's/^/>/g' >> ${RUN_LOG} 2>&1
  184.    COUNT=`expr ${COUNT} + 1`
  185.   done
  186.   log "TOTAL BACKUPED: ${COUNT}"
  187.   log ""
  188. else
  189.   if [ ${CLEAN} = "true" ]; then  #清除已上传的文件
  190.    log "Remove transfered files ... "
  191.    COUNT=0
  192.    BATCH_CLEAN=`grep -B 3 "226 Transfer complete." ${TRANSFER_LOG} |grep "local:" |awk -F" " '{printf("%s\n",$2);}'`
  193.    log "Execute local clear(${LOCAL_DIR}) ... "
  194.    cd ${LOCAL_DIR}
  195.    for I in ${BATCH_CLEAN}
  196.    do
  197.     rm -fv ${I} |sed 's/$/ deleted./g' >> ${RUN_LOG} 2>&1
  198.     COUNT=`expr ${COUNT} + 1`
  199.    done
  200.    log "TOTAL DELETED: ${COUNT}"
  201.    log ""
  202.   fi
  203. fi
  204. elif [ ${METHOD} = "download" ]; then
  205. if [ ${CLEAN} = "true" ]; then  #清除已下载的文件
  206.   log "Execute remote clear ... "
  207.   BATCH_CLEAN=`grep -B 3 "226 Transfer complete." ${TRANSFER_LOG} |grep "local:" |awk -F" " '{printf("delete %s\n",$2);}'`
  208.   echo "
  209.   open ${REMOTE_IP}
  210.   prompt off
  211.   user ${USER} ${PSWD}
  212.   lcd ${LOCAL_DIR}
  213.   cd ${REMOTE_DIR}
  214.   ${BATCH_CLEAN}
  215.   close
  216.   bye
  217.   " |ftp -v -n |tee ${TRANSFER_LOG} |sed 's/^/>/g' >> ${RUN_LOG} 2>&1
  218.   COUNT=`grep "250 DELE command successful." ${TRANSFER_LOG} |wc -l`
  219.   log "TOTAL DELETED: ${COUNT}"
  220.   log ""
  221. fi
  222. else
  223. error "Tansfer mode(-[U(pload) D(ownload)]) must be set.(3)"
  224. fi

  225. quit  #正常退出

  226. #========================================================

  227. 调用方法:
  228. auto_trans.sh
  229. -[U(pload) D(ownload)]
  230.   传送方向, 上传或下载, 必须指定, 且只能指定其一
  231. -[C(lean)]
  232.   清除已传送的文件(默认不清除)
  233. -[P(assive)]
  234.   被动模式(默认主动)
  235. -[A(scii)]
  236.   文本模式(默认二进制)
  237. -[h host]
  238.   主机地址(默认127.0.0.1)
  239. -[u user]
  240.   帐号(默认匿名)
  241. -[p password]
  242.   密码(默认匿名)
  243. -[r remote path]
  244.   远端路径(默认根目录)
  245. -[l local path]
  246.   本地路径(默认当前目录)
  247. -[b backup path]
  248.   文件备份目录(默认不备份)
  249. -[t filetype]
  250.   要传送的文件类型(默认*.*)
  251. -[f file list]
  252.   要传送的文件列表(默认无)
复制代码

把版权改了, 嘎嘎~~

[ 本帖最后由 dinner3000 于 2005-12-28 12:53 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-12-28 12:35 |只看该作者
晕, 这么强的脚本, 竟然没人看~~~

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-12-28 12:44 |只看该作者
原帖由 dinner3000 于 2005-12-28 12:35 发表
晕, 这么强的脚本, 竟然没人看~~~

要是copyleft就更好啦

论坛徽章:
0
4 [报告]
发表于 2005-12-28 12:50 |只看该作者
要是copyleft就更好啦

既然发到这里啦, 大家自然可以随便使用,修改~~~~

论坛徽章:
0
5 [报告]
发表于 2006-01-05 13:14 |只看该作者
不错

论坛徽章:
0
6 [报告]
发表于 2006-01-05 13:52 |只看该作者
这是好贴啊
wayy2008 该用户已被删除
7 [报告]
发表于 2006-01-05 20:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2009-07-22 16:54 |只看该作者
简单的问题复杂化?脚本有点问题,不太会调试,哪位大侠调一下?

论坛徽章:
0
9 [报告]
发表于 2009-07-22 17:58 |只看该作者
呵呵,功能蛮全的。

论坛徽章:
0
10 [报告]
发表于 2009-07-23 23:22 |只看该作者
标记一下,以后估计能用得到
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP