传输协议
FTP
FTPS
SFTP
SCP
为什么使用WinSCP?
CMD的FTP命令
FileZilla
PuTTY
rsync
Sublime的SFTP插件
WinSCP
WinSCP进行简单代码文件同步
总结
备注
参考
前言
以前写代码的时候,大多数时候是本地环境开发,然后统一FTP拖拽上传,所以一般来说本地查看修改效果即可。后来项目变大,文件越来越多,项目分工合作,整合项目配置本地环境就变得非常复杂了,并且团队代码不能实时同步更新,所以一般来说会采用线上测试服务器,进行统一的测试开发。那么修改代码之后的手动上传,就成了非常耗时的事情,文件夹切换来切换去拖拽,有时候自己都晕了,所以自动化的脚本部署必不可少,不光是开发的时候使用,服务器上线之后的分布式服务器部署也有用,通过git的代码提交钩子等,我们可以完成整个代码部署的自动化。
尝试的过程中遇到挺多坑,记录总结一下,先从协议开始。
传输协议
FTP
FTP(File Transfer Protocol):是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。FTP是基于TCP协议的,因此iptables防火墙设置中只需要放开指定端口(21 + PASV端口范围)的TCP协议即可。
FTP的PORT(主动模式)和PASV(被动模式)
PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:
PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:
FTPS
即FTP借助SSL协议加密传输,不但要用FTP服务器还要用SSL协议加密。
SFTP
Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 与 FTP 有着几乎一样的语法和功能。SFTP 为 SSH的一部分。SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
SCP
SCP就是secure copy,是用来进行远程文件拷贝的。数据传输使用 SSH,并且和SSH 使用相同的认证方式,提供相同的安全保证 。 与RCP 不同的是,SCP 在需要进行验证时会要求你输入密码或口令。
为什么使用WinSCP?
测试服务器是Windows的,用的FileZilla Server作为FTP服务器,FileZilla Server不支持SFTP,只支持FTP和FTPS
CMD的FTP命令
CMD是自带有FTP命令的,一开始的时候就打算用FTP命令来写脚本部署完事,但是悲剧的是,只支持主动模式,这就意味着只能由服务器连接到我们主机,但是我们是内网啊,做路由NAT映射又太麻烦了,所以第一次尝试失败告终
FileZilla
FileZilla的GUI客户端其实挺好用的,主流协议都支持,但悲剧的是,FileZilla只有客户端GUI模式,没有cli模式!!这就非常尴尬了…
PuTTY
PuTTY 提供了两个文件传输工具,PSCP (PuTTY Secure Copy client)和PSFTP (PuTTY SFTP client)
PSCP 通过 SSH 连接,在两台机器之间安全的传输文件,可以用于任何 SSH(包括 SSH v1、SSH v2) 服务器。
PSFTP 则是 SSH-2 中新增的特性,使用的是新的 SFTP 协议,使用上与传统的 FTP 类似。事实上 PSCP 如果发现 SFTP 可用,PSCP就会使用 SFTP 协议来传输文件,否则还是 SCP 协议。PSFTP 与 PSCP 相比,PSFTP 的优点是可以与服务器进行交互,遍历服务器上的文件系统,在一个会话中上传或下载多个文件。而 PSCP 只能一次传输一个文件,传输完毕后立刻终止会话。
但是悲剧的是,FileZilla Server不支持SFTP!!!
rsync
rsync全称remote sync,是一种更高效、可以本地或远程同步的工具,之所以高效是因为rsync会对需要同步的源和目的进度行对比,只同步有改变的部分,所以比scp命令更高效,但是rsync本身是一种非加密的传输,可以借助-e选项来设置具备加密功能的承载工具进行加密传输。
但是rsync主要是linux下使用,所以略过
Sublime的SFTP插件
插件在开发写代码过程中挺好用的,但必须依附于Sublime才能用,没有CLI模式,无法实现脚本化部署。无法对其扩展定制。
WinSCP
最后上*上面找到了答案,是WinSCP的作者亲自解答的。
主流的FTP传输协议都支持,并且提供cli的模式,最重要的是!新版本提供了synchronize命令,使用的时候更加方便。
WinSCP进行简单代码文件同步
https://winscp.net/eng/docs/scripting
1、写个.bat文件让WinSCP来执行脚本文件
@echo off
cd E:\工具\winscp553
e:
winscp /script=C:\Users\Leestar\Desktop\script
rem pause
2、写WinSCP的脚本文件
open ftp://username:password@address -passive
put D:\test\test.php /wwwroot/test/test.php
exit
#synchronize remote D:\test /wwwroot/test
#put -neweronly D:\D:\test /wwwroot/test
#低版本没有neweronly,注意下载最新版本
3、cmd运行.bat进行同步。
总结
通过WinSCP,我们实现了简单的代码文件同步,释放双手,节约了部署时间,基于此我们还能够定制项目的部署方案。
学习过程中还发现了一个好东西——Walle
Walle 一个web部署系统工具,配置简单、功能完善、界面流畅、开箱即用!支持git、svn版本管理,支持各种web代码发布,PHP,Python,JAVA等代码的发布、回滚,可以通过web来一键完成。
原理图如下:
备注
Telnet
- Telnet是电信(Telecommunications)和网络(Networks)的联合缩写,这是一种在UNIX平台上最为人所熟知的网络协议。
- Telnet使用端口23,它是专门为局域网设计的。
- Telnet不是一种安全通信协议,因为它并不使用任何安全机制,通过网络/互联网传输明文格式的数据,包括密码,所以谁都能嗅探数据包,获得这个重要信息。
- Telnet中没有使用任何验证策略及数据加密方法,因而带来了巨大的安全威胁,这就是为什么telnet不再用于通过公共网络访问网络设备和服务器。
- 在Linux系统上,telnet很容易使用yum来安装:
SSH
- SSH代表安全外壳(Secure Shell),它现在是通过互联网访问网络设备和服务器的唯一的主要协议。
- SSH默认情况下通过端口22运行;不过,很容易更改这个端口。
- SSH是一种非常安全的协议,因为它共享并发送经过加密的信息,从而为通过互联网等不安全的网络访问的数据提供了机密性和安全性。
- 一旦通讯的数据使用SSH经过加密,就极难解压和读取该数据,所以我们的密码在公共网络上传输也变得很安全。
- SSH还使用公钥用于对访问服务器的用户验证身份,这是一种很好的做法,为我们提供了极高的安全性。
- SSH主要用在所有流行的操作系统上,比如Unix、Solaris、Red-Hat Linux、CentOS和Ubuntu等。
支持本地以及SFTP的GUI文件同步工具
http://www.freefilesync.org
参考
http://pigga.iteye.com/blog/2338157
https://en.wikipedia.org/wiki/List_of_FTP_commands
http://desert3.iteye.com/blog/1684130
https://en.wikipedia.org/wiki/List_of_FTP_commands
https://winscp.net/eng/docs/script_upload_file_list#scripting
https://winscp.net/eng/docs/scriptcommand_synchronize
http://blog.csdn.net/emili/article/details/6858818