項目上有服務器文件操作的需求, 遇到的問題和調試過程記錄如下:
簡單了解SFTP:
在SSH軟件包中,已經包含了一個叫作SFTP(Secure File Transfer Protocol)的安全文件信息傳輸子系統,SFTP本身沒有單獨的守護進程,它必須使用sshd守護進程(端口號默認是22)來完成相應的連接和答復操作,所以從某種意義上來說,SFTP並不像一個服務器程序,而更像是一個客戶端程序。SFTP同樣是使用加密傳輸認證信息和傳輸的數據,所以,使用SFTP是非常安全的。但是,由於這種傳輸方式使用了加密/解密技術,所以傳輸效率比普通的FTP要低得多,如果對網絡安全性要求更高時,可以使用SFTP代替FTP(來源:百度百科)
調試背景:
Sftp傳輸協議下的服務器文件接收與處理:(因為linux環境與windows環境的區別,測試存在一定不便,且服務器配置不同,所支持的ssh協議版本也不同);
問題與收獲:
關於對服務器中外圍接口推送的壓縮文件處理:SFTP協議,接收壓縮文件並進行解析: 其中最主要的就是讀取文件,解壓文件,備份文件,刪除文件。

開發時出現的錯誤基本上是由於無權限和路徑錯誤導致(ps:路徑錯誤也會顯示無權限),另外服務器環境與本地開發環境不同,所以測試很容易出現差異。 根據開發需要,第一步要建立與ftp服務器的連接,這個時候拋出了異常信息:[could not parse reponse code],但是詳細信息其實是在debug內的detailMessage內:[Could not parse response code. Server Reply: SSH-2.0-OpenSSH_6.6.1] ,百度可知原因是FTPClient不支持通過協議SSH2進行SFTP連接,只能更換方法實現,可以使用com.jcraft.jsch.JSch提供的SSH解決問題,即用ChannelSftp 代替FTPClient。
服務器順利連接后,訪問文件出現了問題: Permission denied (沒有權限訪問),以及備份文件的時候出現 :No such file, 出現這兩個問題的原因有二:路徑不正確(這點也會導致報錯無權限..),以及參數錯誤(比如備份文件時路徑名要具體到/xx/wz.zip,如果只寫路徑或者文件名前綴是不行的)。


關於linux上的路徑分隔符目前有三種說法:\\xxx\\yy\\zz.txt ,或者/xxx/yy/zz.txt,或者使用File.separator作為分隔符,這樣會根據環境自動使用/或者\\進行分割。windows本地測試很多方法是沒法順利訪問服務器文件的,比如rename方法等(簡單說一下這個方法:這個方法如果路徑相同則會進行文件重命名,路徑不同則會進行文件移動,備份文件可以用這個方法。)
PS:sftp的一些方法在本地運行可能會出現權限問題
