使用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

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

WinSCP進行簡單代碼文件同步

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

 
 
 
         
  1. @echo off
  2. cd E:\工\winscp553
  3. e:
  4. winscp /script=C:\Users\Leestar\Desktop\script
  5. rem pause

2、寫WinSCP的腳本文件

 
 
 
         
  1. open ftp://username:password@address -passive
  2. put D:\test\test.php /wwwroot/test/test.php
  3. exit
  4. #synchronize remote D:\test /wwwroot/test
  5. #put -neweronly D:\D:\test /wwwroot/test
  6. #低版本沒有neweronly,注意下載最新版本

3、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM