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 $PORT
    user $USER $PWD
    bin  #bin等价于bi,binary等,表示以二进制方式传输,另一种方式是ascii
    #passive表示设置为被动模式的FTP
    #prompt
    #被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况.
    #主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口
    #被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况.
    #因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后主机,而只允许由防火墙之后的主机发起的连接请求通过.
    #因此在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作.
    cd $REMOTE_DIR
    lcd $LOC_DIR
    mget $DEST_FILES  #多个文件的下载
    #get $DEST_FILE_NAME $LOC_FILE_NAME  #单个文件的下载
    close
    quit  #或bye
    EOF
}

UploadFiles(){
    ftp -ivn << EOF
    open $IP $PORT
    user $USER $PWD
    bin
    #passive 可选
    cd $REMOTE_DIR
    lcd $LOC_DIR
    mput $DEST_FILES      #多个文件的上传
    #put $LOC_FILE_NAME $DEST_FILE_NAME  #单个文件的上传
    close
    quit
EOF
}

方式二:sftp方式

  sftp是一款交互式的文件传输程序,命令的运行和使用方式与ftp命令相似,但是,sftp命令对传输的所有信息使用ssh加密,它还支持公钥认证和压缩等功能,安全性更好。使用sftp必须安装openSSH组件,它是依赖于ssh服务的。

方式三: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 << EOF
    open ftp://$USER:[email protected]$HOST
    mirror -R $LOC_DIR $DEST_DIR    #上传同步文件
    mirror -vn $DEST_DIR $LOC_DIR   #下载文件
    close
    exit
EOF

(2)lftp与sftp混合使用

#!/bin/bash

#yum -y install lftp openssh

lftp -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 [参数] [源路径] [目标路径]          #路径的完整格式:[email protected]:$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 [email protected]$HOST:$DEST_DIR
 expect {
 "(yes/no)?"
   {
    send "yes\n"
    expect "*assword:" { send "$PWD\n"}
 }

注意:1、注意*的使用

scp -r $LOC_DIR/*  [email protected]$DEST_HOST:$DEST_DIR 对拷文件夹下所有文件 (不包括文件夹本身)
scp -r $LOC_DIR  [email protected]$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参考: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:[email protected]:port/子目录或文件
2)快捷格式: ftp://[email protected]/子目录或文件

使用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:[email protected]         #简洁写法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:[email protected]$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,转载请注明出处!!!

时间: 2024-10-06 15:16:11

shell操作典型案例--FTP操作的相关文章

[Java] 使用 Apache的 Commons-net库 实现FTP操作

因为最近工作中需要用到FTP操作,而手上又没有现成的FTP代码.就去网上找了一下,发现大家都使用Apache的 Commons-net库中的FTPClient. 但是,感觉用起来不太方便.又在网上找到了很多封装过的.觉得也不是很好用.于是就自己写了一个.网上大多是例子都是直接对文件进行操作,而我更需要的是读到内存,或者从内存上写.并且有很多实用单例模式,但是我觉得如果调用比较多的话,可能会出现问题. 1 /** 2 * 封装了一些FTP操作 3 */ 4 import java.io.Buffe

利用PBFunc在Powerbuilder中进行FTP操作

PBFunc.dll包含了FTP的操作,使用FTP时主要需要以下步骤: 1.调用of_Login函数登录Ftp服务器 2.调用FTP的各种方法 3.Ftp操作完毕后调用of_LoginOut方法进行注销 代码如下: n_pbfunc_ftp lnv_ftp IF Not lnv_ftp.of_Login("192.168.68.21",21,"ftpuser","123456") Then MessageBox("提示",&q

Linux Shell脚本与Vim常用操作笔记

本篇笔记记录最最基本的vim和shell操作. ShellScript能干什么 Shellscript类似与Windows的批处理,可以把很多指令汇总到一起,于是可以很容易地通过一个操作执行多个命令.很轻量,有效率. 在Vim中编写 Vim/Vi编辑器很强大,功能非常多,快捷键.指令更多,只需要知道最常用的就够了. Vi有3种工作模式 1.命令模式 进去之后的默认模式就是命令模式.能接受命令,但是不明文显示. 2.输入模式 命令模式按下a键就进入输入模式(还能按i.o.s等等).按Esc返回命令

scala操作hbase案例

案例取自streaming-app项目 package com.asiainfo.ocdc.streaming.tools import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.conf.Configuration import org.apache.hadoop.hbase.client.{Put, Result, Get, HTable} import org.apache.hadoop.hbas

Java的ftp操作

下面是FtpClient类的一些介绍: sun.net.ftp.FtpClient.,该类库首要供给了用于树立FTP衔接的类.运用这些类的办法,编程人员能够长途登录到FTP服务器,罗列该服务器上的目录,设置传输协议,以及传送文件.FtpClient类涵盖了简直一切FTP的功用,FtpClient的实例变量保留了有关树立"署理"的各种信息.下面给出了这些实例变量: public static boolean useFtpProxy 这个变量用于标明FTP传输过程中是不是运用了一个署理,因

java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例

package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.List; import nu.xom.Document; import nu.

让你提前认识软件开发(22):shell脚本中的文件操作

第1部分 重新认识C语言 shell脚本中的文件操作 [文章摘要] 编写shell脚本时,经常会涉及到对文件的操作,比如从文件中读取一行数据.向文件追加一行数据等.完成文件读写操作的方法有很多,了解各种命令下文件操作的执行情况,有助于开发人员在不同使用场景下选择合适的命令. 本文以实际的shell脚本为例,介绍了对文件进行操作的不同方法,为相关开发工作提供了参考. [关键词] shell  文件操作  读写  效率 一.概述 在某些软件项目的需求文档中,要求程序一次性读或写的数据规模较大,可达1

shell中简单的字符串操作

在SHELL编程中,经常要处理一些字符串变量.比如,计算长度啊.截取子串啊.字符替换啊等等,常常要用到awk.expr.sed.tr等命令.下面给大家介绍个简单的字符串处理方法,用不着嵌套复杂的子命令. ${#VALUE}:计算VALUE字符串的字符数量. ${VALUE%.*}或${VALUE%%.*}:删除VALUE字符串中以分隔符"."匹配的左边字符,保留右边字符. ${VALUE#*.}或${VALUE##*.}:删除VALUE字符串中以分隔符"."匹配的右

FTP操作类---拷贝、移动、删除文件/创建目录

<?php /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp { public $off; // 返回操作状态(成功/失败) public $conn_id; // FTP连接 /** * 方法:FTP连接 * @FTP_HOST -- FTP主机 * @FTP_PORT -- 端口 * @FTP_USER -- 用户名 * @FTP_PASS -- 密码 */