使用WinSCP進行簡單代碼文件同步

前言

之前寫代碼的時候,大多數時候是本地環境開發,而後統一FTP拖拽上傳,因此通常來講本地查看修改效果便可。後來項目變大,文件愈來愈多,項目分工合做,整合項目配置本地環境就變得很是複雜了,而且團隊代碼不能實時同步更新,因此通常來講會採用線上測試服務器,進行統一的測試開發。那麼修改代碼以後的手動上傳,就成了很是耗時的事情,文件夾切換來切換去拖拽,有時候本身都暈了,因此自動化的腳本部署必不可少,不光是開發的時候使用,服務器上線以後的分佈式服務器部署也有用,經過git的代碼提交鉤子等,咱們能夠完成整個代碼部署的自動化。php

嘗試的過程當中遇到挺多坑,記錄總結一下,先從協議開始。linux

傳輸協議

FTP

FTP(File Transfer Protocol):是TCP/IP網絡上兩臺計算機傳送文件的協議,FTP是在TCP/IP網絡和INTERNET上最先使用的協議之一,它屬於網絡協議組的應用層。FTP客戶機能夠給服務器發出命令來下載文件,上載文件,建立或改變服務器上的目錄。相比於HTTP,FTP協議要複雜得多。複雜的緣由,是由於FTP協議要用到兩個TCP鏈接,一個是命令鏈路,用來在FTP客戶端與服務器之間傳遞命令;另外一個是數據鏈路,用來上傳或下載數據。FTP是基於TCP協議的,所以iptables防火牆設置中只須要放開指定端口(21 + PASV端口範圍)的TCP協議便可。 git

FTP的PORT(主動模式)和PASV(被動模式)
PORT中文稱爲主動模式,工做的原理: FTP客戶端鏈接到FTP服務器的21端口,發送用戶名和密碼登陸,登陸成功後要list列表或者讀取數據時,客戶端隨機開放一個端口(1024以上),發送 PORT命令到FTP服務器,告訴服務器客戶端採用主動模式並開放端口;FTP服務器收到PORT主動模式命令和端口號後,經過服務器的20端口和客戶端開放的端口鏈接,發送數據,原理以下圖:

PASV是Passive的縮寫,中文成爲被動模式,工做原理:FTP客戶端鏈接到FTP服務器的21端口,發送用戶名和密碼登陸,登陸成功後要list列表或者讀取數據時,發送PASV命令到FTP服務器, 服務器在本地隨機開放一個端口(1024以上),而後把開放的端口告訴客戶端, 客戶端再鏈接到服務器開放的端口進行數據傳輸,原理以下圖:
github

FTPS

即FTP藉助SSL協議加密傳輸,不但要用FTP服務器還要用SSL協議加密。web

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模式!!這就很是尷尬了…ssh

PuTTY

PuTTY 提供了兩個文件傳輸工具,PSCP (PuTTY Secure Copy client)和PSFTP (PuTTY SFTP client)
PSCP 經過 SSH 鏈接,在兩臺機器之間安全的傳輸文件,能夠用於任何 SSH(包括 SSH v一、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

最後上stackoverflow上面找到了答案,是WinSCP的做者親自解答的。
主流的FTP傳輸協議都支持,而且提供cli的模式,最重要的是!新版本提供了synchronize命令,使用的時候更加方便。

WinSCP進行簡單代碼文件同步

https://winscp.net/eng/docs/scripting
一、寫個.bat文件讓WinSCP來執行腳本文件

 
 
 
 
@echo offcd E:\工\winscp553e:winscp /script=C:\Users\Leestar\Desktop\scriptrem pause

二、寫WinSCP的腳本文件

 
 
 
 
open ftp://username:password@address -passiveput D:\test\test.php /wwwroot/test/test.phpexit#synchronize remote D:\test /wwwroot/test#put -neweronly D:\D:\test /wwwroot/test#低版本沒有neweronly,注意下載最新版本

三、cmd運行.bat進行同步。

總結

經過WinSCP,咱們實現了簡單的代碼文件同步,釋放雙手,節約了部署時間,基於此咱們還可以定製項目的部署方案。
學習過程當中還發現了一個好東西——Walle
Walle 一個web部署系統工具,配置簡單、功能完善、界面流暢、開箱即用!支持git、svn版本管理,支持各類web代碼發佈,PHP,Python,JAVA等代碼的發佈、回滾,能夠經過web來一鍵完成。
原理圖以下:

備註

Telnet

  1. Telnet是電信(Telecommunications)和網絡(Networks)的聯合縮寫,這是一種在UNIX平臺上最爲人所熟知的網絡協議。
  2. Telnet使用端口23,它是專門爲局域網設計的。
  3. Telnet不是一種安全通訊協議,由於它並不使用任何安全機制,經過網絡/互聯網傳輸明文格式的數據,包括密碼,因此誰都能嗅探數據包,得到這個重要信息。
  4. Telnet中沒有使用任何驗證策略及數據加密方法,於是帶來了巨大的安全威脅,這就是爲何telnet再也不用於經過公共網絡訪問網絡設備和服務器。
  5. 在Linux系統上,telnet很容易使用yum來安裝:

SSH

  1. SSH表明安全外殼(Secure Shell),它如今是經過互聯網訪問網絡設備和服務器的惟一的主要協議。
  2. SSH默認狀況下經過端口22運行;不過,很容易更改這個端口。
  3. SSH是一種很是安全的協議,由於它共享併發送通過加密的信息,從而爲經過互聯網等不安全的網絡訪問的數據提供了機密性和安全性。
  4. 一旦通信的數據使用SSH通過加密,就極難解壓和讀取該數據,因此咱們的密碼在公共網絡上傳輸也變得很安全。
  5. SSH還使用公鑰用於對訪問服務器的用戶驗證身份,這是一種很好的作法,爲咱們提供了極高的安全性。
  6. 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

相關文章
相關標籤/搜索