shell中利用ftp 上传文件夹功能

  我们知道ftp 只能用来上传或者下载文件,一次单个或者多个,怎么实现将文件夹的上传和下载呢?

可以利用先在remote ip上建立一个相同的文件夹目录,然后将文件放到各自的目录中去

1、循环遍历出要上传的文件夹中的文件夹目录

2、遍历出每个文件夹下的文件

3、逐一上传文件

ftp 命令

图中有众多的交互,我们不想让他显示这些交互

可以使用参数 屏蔽掉

ftp [-v] [-n] [-i] [-d] [-g] [-s:filename] [-a] [-w:windowsize] [computer]

参数

-v 禁止显示远程服务器响应。

-n 禁止自动登录到初始连接。

-I 多个文件传送时关闭交互提示。

-d 启用调试、显示在客户端和服务器之间传递的所有 ftp 命令。

-g 禁用文件名组,它允许在本地文件和路径名中使用通配符字符(* 和 ?)。(请参阅联机“命令参考”中的 glob 命令。)

-s: filename指定包含 ftp 命令的文本文件;当 ftp 启动后,这些命令将自动运行。该参数中不允许有空格。使用该开关而不是重定向 (>)。

-a 在捆绑数据连接时使用任何本地接口。

-w:windowsize 替代默认大小为 4096 的传送缓冲区。

Computer 指定要连接到远程计算机的计算机名或 IP 地址。如果指定,计算机必须是行的最后一个参数。

下面是一些常用命令:

!:   从ftp子系统退出到系统外壳

?:     显示ftp说明,跟help一样

append: 添加文件,格式为:append 本地文件远程文件

cd:   更换远程目录

lcd:  更换本地目录,若无参数,将显示当前目录

open: 与指定的ftp服务器连接 open computer [port]

close:结束与远程服务器的 FTP 会话并返回命令解释程序

bye:     结束与远程计算机的 FTP 会话并退出 ftp

dir:  结束与远程计算机的 FTP 会话并退出 ftp

get 和 recv:使用当前文件转换类型将远程文件复制到本地计算机 get remote-file [local-file]

send 和 put: 上传文件:send local-file [remote-file]

将这些命令组合成脚本

#!/bin/bash
host=‘127.0.0.1‘
user=‘root‘
passwd=‘1988‘
updir=/opt/123
todir=123dirs=`find $updir -type d -printf $todir/‘%P\n‘| awk ‘{if ($0 == "")next;print "mkdir " $0}‘`
files=`find $updir -type f -printf ‘put %p %P \n‘`
ftp  -nv  $host <<EOF
user ${user} ${passwd}
type binary
$dirs
cd $todir
$files
quit
EOF

  命令解析:

dirs=`find $updir -type d -printf $todir/‘%P\n‘| awk ‘{if ($0 == "")next;print "mkdir " $0}‘` 
find $updir -type d -printf $todir/‘%P\n‘:将上传的目录格式化输出;%P只输出指定目录下的文件夹,而输出他的上层目录,所以要加上一个上层目录awk 中的{if($0=="")next},next跳过了目录是空的情况awk next语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。next的实例:
text.txt 内容是:

a
b
c
d
e

[[email protected] shell]$ awk ‘NR%2==1{next}{print NR,$0;}‘ text.txt
2 b
4 d

当记录行号除以2余 1,就跳过当前行。下面的print NR,$0也不会执行。 下一行开始,程序有开始判断NR%2 值。这个时候记录行号是:2 ,就会执行下面语句块:‘print NR,$0‘

  

要求:

文件:text.txt 格式:
web01[192.168.2.100]

httpd            ok
tomcat               ok
sendmail               ok
web02[192.168.2.101]
httpd            ok
postfix               ok
web03[192.168.2.102]
mysqld            ok
httpd               ok

需要通过awk将输出格式变成:

web01[192.168.2.100]:   httpd            ok
web01[192.168.2.100]:   tomcat               ok
web01[192.168.2.100]:   sendmail               ok
web02[192.168.2.101]:   httpd            ok
web02[192.168.2.101]:   postfix               ok
web03[192.168.2.102]:   mysqld            ok
web03[192.168.2.102]:   httpd               ok

分析:

分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行。

[[email protected] shell]$ awk ‘/^web/{T=$0;next;}{print T":\t"$0;}‘ test.txt

web01[192.168.2.100]:   httpd            ok
web01[192.168.2.100]:   tomcat               ok
web01[192.168.2.100]:   sendmail               ok
web02[192.168.2.101]:   httpd            ok
web02[192.168.2.101]:   postfix               ok
web03[192.168.2.102]:   mysqld            ok
web03[192.168.2.102]:   httpd               ok

  

files=`find $updir -type f -printf ‘put %p %P \n‘`这一命令是找出目录中的文件,然后拼成put 语句
时间: 2024-10-06 04:55:13

shell中利用ftp 上传文件夹功能的相关文章

本地虚拟机中匿名ftp上传文件失败的问题

在10.10.50.230中新建了一个匿名的ftp服务器,结果在10.10.50.241中上传文件时提示: local: README.txt remote: /var/ftp/pub/upload 227 Entering Passive Mode (10,10,50,230,117,8). 553 Could not create file.   由于搭建步骤是完全按照标准文档建立的,vsftp.conf的设置应该没有问题,检查:getsebool -a|grep ftp 发现: allow

shell---两句命令打造FTP上传文件夹

简单代码如下:需上传目录为/root/sk #!/bin/bash  sss=`find /root/sk -type d -printf '%P\n'| awk '{if ($0 == "")next;print "mkdir " $0}'`  aaa=`find /root/sk -type f -printf 'put %p %P \n'` ftp -nv 127.0.0.1 <<EOF  user kabc kabc  type binary 

HTML5上传文件夹功能

截图来源:https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/webkitdirectory 原文地址:https://www.cnblogs.com/webBirdsFly/p/11535308.html

2.1.5基础之命令行链接ftp dos中的ftp上传下载文件

Windows命令行batcmd脚本的应用之自动备份 异地备份2.1.5基础之命令行链接ftp dos中的ftp上传下载文件 讲解环境 VMware Workstation 12 桌面虚拟计算机软件创建虚拟机安装操作系统:http://edu.51cto.com/course/10007.html PC1:192.168.1.201 远程地址:192.168.100.100:2001 windows service2008 pc1 Admin111FTP虚拟用户 fileaa fileaaPC2

再看ftp上传文件

前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在本地测试程序上传到ftp服务器一点问题都没有,奇怪的是当发布Web和ftp到同一个IIS下,上传文件时程序直接卡死,然后页面卡死,后来我又发现把Web和ftp分开发布在两台机器上问题又得到解决,所以当时放弃了这个方案. 再看ftp上传文件 前几天偶然看到Wolfy写到一个项目总结,其中提到了用Ser

PHP使用FTP上传文件到服务器(实战篇)

我们在做开发的过程中,上传文件肯定是避免不了的,平常我们的程序和上传的文件都在一个服务器上,我们也可以使用第三方sdk上传文件,但是文件在第三方服务器上.现在我们使用PHP的ftp功能把文件上传到我们自己的服务器,我使用的linux的服务器,首先确保服务器上配置好ftp,以vsftpd为例. FTP类,此类包含把文件上传.下载.删除和删除ftp服务器目录功能,php版本>=7.0 <?php /** * Created by PhpStorm. * User: 123456 * Date: 2

php 利用socket上传文件

php 利用socket上传文件 张映 发表于 2010-06-02 分类目录: php 一,利用fsockopen来上传文件 以前我写过一篇关于socket通信原理的博文http://blog.51yip.com/php/673.html有兴趣的朋友可以看看,前面讲的那篇博文,socket的服务器和客户端都是要用php命令来运行的.平常我们上传文件是浏览本地文件,通过一个php程序将文件上传一个地方,这个时候我们用php命令来运行php程序就不方便了.这个时候我们可以用fsockopen来打开

使用jQuery.FileUpload插件和服Backload组件自定义上传文件夹

在零配置情况下,文件的上传文件夹是根目录下的Files文件夹,如何自定义文件的上传文件夹呢? □ 在web.config中配置 1: <configuration> 2: <configSections> 3: ... 4: <section name="backload" type="Backload.Configuration.BackloadSection, Backload, Version=1.9.3.1, Culture=neutra

Java ftp 上传文件和下载文件

今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接:http://blog.csdn.net/yucaifu1989/article/details/51483118 为了方便大家对比,我吧文章代码偷了过来: import java.io.File; import java.io.FileInputStream; import java.io.Fil