shell操作典型案例--FTP操作
从FTP服务器上下载文件或上传文件到FTP服务器是生产环境中比较常见的场景之一。
shell操作FTP的方式整理如下:
思路一:使用shell调用ftp等客户端
使用FTP方式,通过shell调用ftp等客户端,从而完成FTP文件的上传、下载等操作。
方式一:ftp方式
一个基本的ftp工具,需安装ftp(yum -y install ftp,后同)。一个样例如下:
########################################################### ##函数功能:FTP上传、下载多个文件、单个文件 ##使用示例: ## DownloadFiles #直接调用,不记录日志 ## #记录日志,将输出追加到日志文件即可## 可以根据需要,在文件名、目录名等处拼接日期、批次号等内容。 ########################################################### IP="" #FTP服务器地址 PORT="" #FTP端口号 USER="" #FTP用户名 PWD="" #FTP用户密码 REMOTE_DIR="" #远程FTP服务器目录 LOC_DIR="" #对应的本地服务器目录 DEST_FILES="" #远程FTP服务器文件DownloadFiles(){ftp -ivn << EOF #-n 不受.netrc文件的影响,表示禁止自动登录到初始连接(ftp默认为读取.netrc文件中的设定)#-i表示在多个文件传输期间关闭交互提示 #-v open $IP $PORTuser $USER $PWDbin #bin等价于bi,binary等,表示以二进制方式传输,另一种方式是ascii#passive表示设置为被动模式的FTP#prompt#被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况. #主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口 #被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况. #因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后主机,而只允许由防火墙之后的主机发起的连接请求通过. #因此在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作. cd $REMOTE_DIRlcd $LOC_DIRmget $DEST_FILES #多个文件的下载#get $DEST_FILE_NAME $LOC_FILE_NAME #单个文件的下载closequit #或byeEOF }UploadFiles(){ftp -ivn << EOFopen $IP $PORTuser $USER $PWDbin #passive 可选cd $REMOTE_DIRlcd $LOC_DIRmput $DEST_FILES #多个文件的上传#put $LOC_FILE_NAME $DEST_FILE_NAME #单个文件的上传closequit EOF }
方式二:sftp方式
sftp是一款交互式的文件传输程序,命令的运行和使用方式与ftp命令相似,但是,sftp命令对传输的所有信息使用ssh加密,它还支持公钥认证和压缩等功能,安全性更好。使用sftp必须安装openSSH组件,它是依赖于ssh服务的。
使用sftp时,若没有配置ssh免密码登陆,往往需要让脚步自动输入密码,为此需要安装expect或sshpass组件,使用时,有三种方式:
方法一:使用expect
第一种方式:在bash中直接使用代码块:
#!/bin/bash #yum -y install expect #使用expect组件需要手动安装 #yum -y install tclUSER="" HOST="" PASSWD="" DEST_DIR="" LOC_DIR=""expect<<-END spawn sftp $USER@$HOST expect {"(yes/no)?" {send "yes\r"}"*assword:" {send "${PASSWD}\r"} } expect "sftp>" send "cd ${DEST_DIR}\n" expect "sftp>" send "lcd ${LOC_DIR}\r" expect "sftp>" send "mget *\r" expect "sftp>" send "quit\r" END
第二种方式:将使用expect自动读入密码与ftp交互部分作为一个单独的脚本,然后在其它脚本中调用
#!/usr/bin/expect #设置参数 set USER [lindex $argv 0] set HOST [lindex $argv 1] set PASSWD [lindex $argv 2] set DEST_DIR [lindex $argv 3] set LOC_DIR [lindex $argv 4]#上传文件到FTP服务器 spawn sftp $USER@$HOST expect {"(yes/no)?" {send "yes\r"}"*assword:" {send "${PASSWD}\r"} } expect "sftp>" send "cd $DEST_DIR\n" expect "sftp>" send "mkdir $DATE_TIME\r" expect "sftp>" send "cd $DEST_DIR\r" expect "sftp>" send "lcd $LOC_DIR\r" expect "sftp>" send "mput *\r" expect "sftp>" send "quit\r" expect eof
call_ftp.sh中调用该脚本部分示例如下:
/usr/bin/expect 脚本路径/exp_ftp.sh $USER $HOST $PASSWD $DEST_DIR $LOC_DIR
使用位置参数传递ftp信息,注意脚本中要写解析器的绝对路径,脚本的绝对路径(推荐)
方法二:使用sshpass
第三种方式:安装使用sshpass
#!/bin/bashyum -y install sshpassHOST="" FTP_USER="" FTP_PASSWD=""export SSHPASS=$FTP_PASSWD sshpass -e sftp -oBatchMode=no -b - $FTP_USER@$HOST << ENDls /bye END
方式三:lftp方式
lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。llftp的界面非常像一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。
需安装lftp。
示例如下:
(1)单独使用lftp
#!bin/bash export NLS_LANG=american_america.AL32UTF8 #设置字符集HOST="" USER="" PASSWD="" LOC_DIR="" DEST_DIR=""/usr/sbin/lftp << EOFopen ftp://$USER:$PASSWD@$HOSTmirror -R $LOC_DIR $DEST_DIR #上传同步文件mirror -vn $DEST_DIR $LOC_DIR #下载文件closeexit EOF
(2)lftp与sftp混合使用
#!/bin/bash#yum -y install lftp opensshlftp -u ${USER},${PWD} sftp://${IP}:${PORT} <<EOF #端口为可选参数,sftp默认端口为22 cd [FTP服务器目录] lcd [本地目录] mget/mput/get/put.. bye EOF
注:几种ftp客户端使用方式大致相同,使用时可以使用help命令查看使用帮助,help 命令名称参考命令参数等方法帮助完成脚本的编写。
思路二:直接远程复制
根据FTP服务的本质是针对文件的,因此考虑像操作文件一样,直接远程复制、移动
方式四:scp/rsync方式
(1)scp
与sftp类似,依赖ssh服务,支持加密传输。有点:安全性好,耗费资源少。使用格式:
scp [参数] [源路径] [目标路径] #路径的完整格式:$USER@HOST:$DIR
本地路径和远程路径都可以做源端或者目标端。样例如下:
#!/usr/bin/expect . ~/.bash_profile ################################################################# ##调用方法: ## /usr/bin/expect 本脚本路径 $SRC_DIR $USER ...(参数列表) #################################################################set SRC_DIR [lindex $argv 0] set USER [lindex $argv 1] set HOST [lindex $argv 2] set src_file [lindex $argv 3] set PWD [lindex $argv 4] spawn scp -r $SRC_DIR $USER@$HOST:$DEST_DIRexpect {"(yes/no)?"{send "yes\n"expect "*assword:" { send "$PWD\n"}}
注意:1、注意*的使用
scp -r $LOC_DIR/* $DEST_USER@$DEST_HOST:$DEST_DIR 对拷文件夹下所有文件 (不包括文件夹本身) scp -r $LOC_DIR $DEST_USER@$DEST_HOST:$DEST_DIR 对拷文件夹下所有文件 (包括文件夹本身)
2、若目标端的文件、目录等与源端名称相同,会覆盖
3、使用scp远程复制文件时,会要求输入密码,一种方法是设置ssh免密码登录。否则,需要安装并使用expect工具,让shell自动输入密码。
(2)rsync
Rsync(Remote Synchronize) 是一个远程资料同步工具,可通过LAN/WAN快速同步多台主机,Rsync使用所为的“Rsync演算法”来使本地主机和远程主机之间达到同步,这个演算法并不是每次都整份传送,它只传送两台计算机之间所备份的资料不同的部分(增量备份),因此速度相当快。
Rsync的优点如下:
1、可以镜像保存整个目录树和文件系统。
2、可以很容易的做到保持原来文件的许可权、时间、软链接等。
3、无须特使许可权即可安装。
4、拥有优化的流程,文件传输效率高。
5、可以使用Rsh、SSH等方式来传输文件,当然也可以直接通过Socket连接。
6、支持匿名传输。
另外,与SCP相比,传输速度不是一个层次级的。我们在局域网时经常用Rsync和SCP传输大量Mysql数据,发现Rsync至少比Scp快20倍以上,所以大家如果需要在Linux/Unix服务器之间互传海量资料,Rsync是非常好的选择。当然,当有大量小文件时,rsync会导致磁盘IO负载很高,而scp基本则影响很小。
使用方法:
rsync [可选参数] 源端 目标端
思考:
若rsync需要处理的文件极多,数量极大,并且需定时处理增量,这种情况下,rsync会先扫描全部文件,然后才会进行增量处理,显然,这个扫描过程是极为消耗资源的,这种情况应该怎么办呢?
参考:rsync参考:http://www.cnblogs.com/suihui/p/3799638.html
scp参考:http://www.cnblogs.com/peida/archive/2013/03/15/2960802.html
思路三:操作ftp的文件地址的URL
ftp文件地址URL结构:
1)完全格式: ftp://username:password@hostname:port/子目录或文件
2)快捷格式: ftp://username@hostname/子目录或文件
使用ftp的URL地址时的注意事项:
1)防止URL中有特殊字符,可以使用双引号"URL"
2)ftp用户的密码、URL等内容中可能包含某些特殊字符,使用时,可能会报错“-bash: !ifewbprint: event not found”,这时,将该内容用单引号括起来即可。
说明:Bash双引号里面使用感叹号(!)就会出现 bash: !: event not found --这样的错误信息 然而换成单引号就没问题这是因为Bash里面称单引号为强
引号,称双引号为弱引号,而特殊字符是不会在强引号里面进行翻译的,只在弱引号里面进行翻译。而感叹号(!)恰巧是Bash的特殊字符,表示进行历史替换,而
历史命令里没有\n这个命令
参考:http://dusong1992.blog.163.com/blog/static/120930552201251710735240/
方式五:curl方式
curl可以在shell下轻松上传下载ftp上的文件,相比ftp命令更具有优势,因为它能在单命令条件下,下载或者上传一个ftp文件,甚至可以删除文件。
需安装curl。
(1)列出FTP服务器上的文件/目录列表:
curl ftp://malu.me/ --user name:passwd curl ftp://malu.me/ –u name:passwd #简洁写法 curl ftp://name:passwd@malu.me #简洁写法2
(2)只列出目录,不显示进度条:
curl ftp://malu.me –u name:passwd -s
(3)下载单个文件:
curl ftp://malu.me/size.zip –u name:passwd -o size.zip
(4)上传单个文件:
curl –u name:passwd -T size.mp3 ftp://malu.me/mp3/
(5)从服务器上删除文件(使用curl传递ftp协议的DELE命令)
curl –u name:passwd ftp://malu.me/ -X 'DELE mp3/size.mp3'
(6)下载多个文件
curl不支持递归下载,不过可以用数组方式下载文件,比如我们要下载1-10.gif连续命名的文件:
curl –u name:passwd ftp://malu.me/img/[1-10].gif –O #O字母大写
要连续下载多个文件:
curl –u name:passwd ftp://malu.me/img/[one,two,three].jpg –O #O字母大写
参考:使用curl下载上传ftp | 陋室博客 http://bolg.malu.me/html/2011/1239.html
方式六:wget方式
wget是一个命令行下的下载工具,体积小但功能完善,它支持断点下载功能,同时支持FTP和HTTP下载方式,支持代理服务器和设置起来方便简单。可以据此实现部分ftp功能。需安装wget,效率上比ftp工具快。
(1)获取文件列表
wget –ftp-user=$USERNAME –ftp-password=$PASSWORD url --no-remove-listing wget --spider URL --no-remove-listing #此处使用ftpURL的完整格式:ftp://$USERNAME:$PASSWORD@$HOST/$DEST_FILE_LIST
#--no-remove-listing 保存监听文件,获取ftp文件列表的html文件
(2)下载文件
样例1:
wget -r url -P $LOC_DIR -nH --cut-dirs=n #url中包含用户名、密码 加上 --cut-dirs=n 忽略n个目录,从FTP服务器根目录算起第几层目录 加上 -P dir 指定本地文件夹dir
样例2:
wget -nH -m --ftp-user=$USER --ftp-password=$PWD URL -nH:不创建以主机名命名的目录。 –cut-dirs:希望去掉原来的目录层数,从根目录开始计算。如果想完全保留FTP原有的目录结构,则不要加该参数。 -m:下载所有子目录并且保留目录结构。
参考:http://www.jb51.net/LINUXjishu/86326.html
本文作者原始链接:http://www.cnblogs.com/chinas/p/6957701.html,转载请注明出处!!!
转载于:https://www.cnblogs.com/chinas/p/6957701.html
shell操作典型案例--FTP操作相关推荐
- UCINET-6软件及UCINET典型案例详细操作步骤解析
数据集名称:UCINET-6软件及UCINET典型案例详细操作步骤解析 相关说明:UCINET网络分析集成软件包括一维与二维数据分析的NetDraw,还有正在发展应用的三维展示分析软件Mage等, ...
- PV 操作与案例分析
这里填写标题 1. PV 操作与案例分析 1.1. PV 操作的原则 1.2. 案例分析 1.2.1. 案例一 1.2.2. 案例二 1.2.3. 案例三 1. PV 操作与案例分析 PV 操作是一种 ...
- shell编程范例之字符串操作[转]
shell编程范例之字符串操作 下面是"在线新华字典"的解释: 字符串: 简称"串".有限字符的序列.数据元素为字符的线性表,是一种数据的逻辑结构.在计算机中可 ...
- [转]文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1
转自:http://blog.csdn.net/soarheaven/archive/2008/12/08/3474152.aspx 最近项目需要对FTP服务器进行操作,现把实现总结如下: 打算分2篇 ...
- 详细的mongo工具手册,包含常见CURD+条件操作+聚合+案例
详细的mongo工具手册,包含常见CURD+条件操作+聚合+案例 原创置顶 ldz_miantiao 最后发布于2019-11-19 21:57:17 阅读数 36 收藏 展开 之前写过一篇mong ...
- python采集修改原创_python应用系列教程——python中ftp操作:连接、登录、获取目录,重定向、上传下载,删除更改...
python中ftp操作: ftp=FTP() #设置变量 ftp.set_debuglevel(2) #打开调试级别2,显示详细信息 ftp.connect("IP"," ...
- java与jquery的选择器区别_java day44【JQuery 基础:概念,快速入门,JQuery对象和JS对象区别与转换,选择器,DOM操作,案例】...
第一章JQuery 基础 1. 概念: 一个JavaScript框架.简化JS开发 * jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScrip ...
- PHP FTP操作类( 上传、拷贝、移动、删除文件/创建目录 )
/** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp {public ...
- VB FTP操作类(可上传、下载、创建文件夹等等)
可实现FTP上传下载,建文件夹等功能,从网上找了一个类,对其进行修改和功能补充,正常使用,非常方便. 切记在使用FtpFindFirstFile 函数查找相应的文件或文件夹后,要使用InternetC ...
最新文章
- python代码转换为pytorch_Pytorch中Tensor与各种图像格式的相互转化详解
- Android之SparseArray<E>详解
- 载波聚合或双连接的方式进行_智能电表常用远程抄表方式,您想知道吗?--老兵聊电之...
- 分析影响流媒体服务器性能的硬件瓶颈
- javascript版购物网站图片轮转
- 关于Meminfo中MemAvailable 理解
- Atitit.每周末总结 于每周一计划日程表 流程表 v8 -------------import 上周遗漏日志补充 检查话费 检查流量情况 Crm问候 Crm表total and 问候
- css inset属性
- PMP备考之路 - 汪博士第六章(项目进度管理)
- L1-7 机工士姆斯塔迪奥【C语言】
- Beta周王者荣耀交流协会第六次会议
- 表的创建(create),修改(alter)和删除(drop)
- linux有没有右键解压文件夹,压缩解压文件无需右键可以这样操作
- 6.5编程实例-立方体透视投影
- wxpython 界面 加密系统
- xp系统总是弹出宽带连接服务器,如何处理xp电脑总是弹出宽带连接
- IMX6ULL - 移植uboot-imx_v2020.04_5.4.70_2.3.0
- 也谈特征值和特征向量的几何意义
- 英特尔服务器主板怎么重装系统,英特尔u盘启动,小编教你英特尔主板怎么在bios中设置u盘启动...
- AE 图层分解与动画循环