[shell]用shell脚本将本地文件夹与ftp上的文件夹同步
需求说明
最近在AIX上做开发,开发机器在office网段,测试机器在lab网段,不能互相通讯,只能通过特定的ftp来传文件。
每次上传的机器都要做:登录ftp,进入我的目录,上传;下载的机器都要做:登录ftp,进入我的目录,下载。以上动作每天都要做几十次,很蛋疼。
这个shell脚本的功能就是完成这些功能:登录ftp,进入我的目录,上传/下载某些文件。要传入一个参数,这个参数如果是“get”,那就从ftp下载;如果是“put”,那就上传到ftp。
因为从来没有用过shell脚本,所以将一些关键点记录下来,以便今后揣摩。
脚本代码
主要流程:
- 判断是不是有一个参数,参数是不是“get”或者“put”,不满足的话就打印错误并退出。
- 将登陆ftp,进入目录的动作写入一个临时的shell脚本。
- 如果参数是“get”,将下载所有文件的代码写入临时脚本。如果参数是“put”,取到本地文件夹的所有文件,逐个将上传代码加入临时脚本。
- 将断开ftp的代码写入临时文件。
- 执行临时文件并删除。
#!/bin/sh if [ $# -ne ] ; then
echo "parameter error"
exit
else
if [ $ != "get" ] && [ $ != "post" ] ; then
echo "parameter error"
exit
fi
fi ftp_host="10.204.16.2"
ftp_user="test"
ftp_password="testtest"
folder_local="/home/smld/sync"
folder_remote="/home/smid/frank/sync"
temp_shell="sync_temp.sh" cat > $temp_shell << EOF
ftp -v -n << !
open $ftp_host
user $ftp_user $ftp_password
lcd $folder_local
cd $folder_remote
bin
prompt off
EOF if [ $ = "get" ]; then
echo "add mget * into $temp_shell"
echo "mget *" >> $temp_shell
elif [ $ = "put" ]; then
for i in `ls $folder_local`; do
echo "add put $i into $temp_shell"
echo "put $i" >> $temp_shell
done
fi cat >> $temp_shell << EOF
quit
!
EOF chmod $temp_shell
echo "execute $temp_shell"
./$temp_shell
rm $temp_shell
代码详解
第1行
#!/bin/sh,用来指定shell的程序路径。
3-11行
if条件语句:
if [条件]; then
elif [条件]; then
else
fi
判断数字是否相等:-eq(equal)-ne(not equal),其他大于小于也类似。
判断字符串时候相等:=(等于)!=(不等于)
条件直接的与或:&&(与)||(或) -a(and)-o(or)
传入参数用$1 $2 ... $9表示 ,$0表示脚本名,$@表示所有参数的数组(可以超过9个),$#表示参数个数。
13-18行
设置一些参数,参数赋值
20-28行
把一段内容输入到文件:cat 内容 > 文件名,用>会清空文件原来的内容,用>>会在文件后面追加。echo也有这样的功能。
将多行内容作为命令的输入,EOF只是一个标志,像21行换成!作用也是一样的:
命令 << EOF
内容段
EOF
ftp相关命令:
- 选项-v:显示详细信息
- 选项-n:关闭自动登录(open之后不会弹出提示输入用户名密码)
- 连接某个ftp:open 主机名
- 登录:user 用户名 密码
- 指定本地目录:lcd 目录
- 转成二进制传输:bin
- 关闭主动模式(mget的时候不会逐个文件询问y/n):prompt off
30-38行
for循环:
for i in 集合; do
done
集合可以使用命令的结果,用``把命令包起来,例如:`ls $folder_local`
[shell]用shell脚本将本地文件夹与ftp上的文件夹同步的更多相关文章
- 本地虚拟机中匿名ftp上传文件失败的问题
在10.10.50.230中新建了一个匿名的ftp服务器,结果在10.10.50.241中上传文件时提示: local: README.txt remote: /var/ftp/pub/upload ...
- shell中利用ftp 上传文件夹功能
我们知道ftp 只能用来上传或者下载文件,一次单个或者多个,怎么实现将文件夹的上传和下载呢? 可以利用先在remote ip上建立一个相同的文件夹目录,然后将文件放到各自的目录中去 1.循环遍历出要上 ...
- Shell脚本调用ftp上传文件
Shell脚本调用ftp上传文件 1.脚本如下 ftp -n<<! open x.x.x.x ###x.x.x.x为ftp地址 user username password ###user ...
- 再看ftp上传文件
前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...
- 通过cmd命令到ftp上下载文件
通过cmd命令到ftp上下载文件 点击"开始"菜单.然后输入"cmd"点"enter"键,出现cmd命令执行框 2 输入"ftp& ...
- Ftp上传文件
package net.util.common; import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...
- PHP使用FTP上传文件到服务器(实战篇)
我们在做开发的过程中,上传文件肯定是避免不了的,平常我们的程序和上传的文件都在一个服务器上,我们也可以使用第三方sdk上传文件,但是文件在第三方服务器上.现在我们使用PHP的ftp功能把文件上传到我们 ...
- 通过cmd完成FTP上传文件操作
一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...
- FTP上传文件到服务器
一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...
随机推荐
- C++ GDI+调用
封装了一个GDI+的使用类 GdiPluss.h #pragma once #include <comdef.h> #include <gdiplus.h> using nam ...
- Spring 4 官方文档学习(十一)Web MVC 框架之locales
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-localeresolve ...
- e675. 翻转缓冲图像
// To create a buffered image, see e666 创建缓冲图像 // Flip the image vertically AffineTransform tx = Aff ...
- e652. Getting the Font Faces for a Font Family
To create a Font object to draw text, it is necessary to specify the font face name. This example de ...
- 搭建局域网SVN代码服务器
1.安装Subversion,安装好后,在控制台输入“svn help”,如果成功安装,则会有很多命令打印输出:2.svnadmin create F:\Java_workspace\Reposito ...
- Discuz论坛post登录C#源码
总结: loginhash formhash 表单参数 seccode 参数最重要 全局 的 获取验证码 判断验证码 到最后提交登录 它都有存在 ,seccode==idhash COOKIE自动维 ...
- 【Java面试题】60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?
接口可以继承接口.抽象类可以实现(implements)接口,抽象类可以继承具体类.抽象类中可以有静态的main方法. 问: 抽象类是否可继承实体类 (concrete class) 答: 抽象类是 ...
- 【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
题目如下: 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次 思路如下: 子线程语主线程为互斥,可用SYNCHRONIZED.很容易想 ...
- Oracle Net Manager 服务命名配置以及用PL/SQL 登陆数据库
我们知道,要连接一个数据库需要知道四个参数: 1. 登陆用户名:user: 2. 登录密码:password: 3. 存放数据库的服务器地址(server_ip)和端口(server_port): 4 ...
- ubuntu下使用sublime text进行C编程开发尝鲜
1 选择编译系统 2 编写文件,编译(Ctrl+B)运行(Shift+Ctrl+B)