如何在java中使用SFTP協(xié)議安全的傳輸文件
本文介紹在Java中如何使用基于SSH的文件傳輸協(xié)議(SFTP)將文件從本地上傳到遠(yuǎn)程服務(wù)器,或者將文件在兩個(gè)服務(wù)器之間安全的傳輸。我們先來(lái)了解一下這幾個(gè)協(xié)議
SSH 是較可靠,專為遠(yuǎn)程登錄會(huì)話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議。比如:我們購(gòu)買的云服務(wù)器登陸的時(shí)候使用的協(xié)議都是ssh。 ftp協(xié)議通常是用來(lái)在兩個(gè)服務(wù)器之間傳輸文件的,但是它本質(zhì)上是不安全的。 那么SFTP是什么?SFTP可以理解為SSH + FTP,也就是安全的網(wǎng)絡(luò)文件傳輸協(xié)議。一般來(lái)說(shuō),SFTP和FTP服務(wù)都是使用相應(yīng)的客戶端軟件來(lái)提供服務(wù)。如果你希望在java代碼中使用SFTP協(xié)議進(jìn)行安全的文件傳輸,那么這篇文章非常適合你。
1. 導(dǎo)入JSch 依賴包
在maven項(xiàng)目pom.xml中導(dǎo)入如下的坐標(biāo),我們使用JSch,JSch將SFTP協(xié)議封裝為對(duì)應(yīng)的API供我們調(diào)用。
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version></dependency>
2. 文件傳輸 ? JSch例子
2.1 get與put方法
在JSch,我們可以使用put和get在服務(wù)器之間進(jìn)行文件傳輸。put方法用來(lái)將文件從本地系統(tǒng)傳輸?shù)竭h(yuǎn)程服務(wù)器。
channelSftp.put(localFile, remoteFile);
get方法將文件從遠(yuǎn)程服務(wù)器下載到本地系統(tǒng)。
channelSftp.get(remoteFile, localFile);
2.2 使用用戶名和密碼進(jìn)行認(rèn)證
JSch jsch = new JSch();jsch.setKnownHosts('/home/zimug/.ssh/known_hosts');jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);jschSession.setPassword(PASSWORD); '/home/zimug/.ssh/known_hosts'為SSH的known_hosts文件,也就是可信遠(yuǎn)程主機(jī)的公鑰保存文件。 USERNAME 為用戶名 REMOTE_HOST遠(yuǎn)程主機(jī)的Ip REMOTE_PORT遠(yuǎn)程主機(jī)端口 PASSWORD遠(yuǎn)程主機(jī)登錄密碼
2.3.使用公鑰和私鑰進(jìn)行認(rèn)證
如果讀者不能理解公鑰和私鑰的用法及含義,需要先自行補(bǔ)充一下SSH知識(shí)。
本地私鑰?/home/登錄用戶名/.ssh/id_rsa 遠(yuǎn)程公鑰默認(rèn)保存位置?~/.ssh/authorized_keysJSch jsch = new JSch();jsch.setKnownHosts('/home/zimug/.ssh/known_hosts');jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);jsch.addIdentity('/home/zimug/.ssh/id_rsa');
2.4 完整JSch文件傳輸示例
將文件從本地系統(tǒng)傳輸?shù)竭h(yuǎn)程服務(wù)器1.2.3.4,并使用SSH密碼登陸方式進(jìn)行身份驗(yàn)證。
import com.jcraft.jsch.*;public class SFTPFileTransfer { private static final String REMOTE_HOST = '1.2.3.4'; //遠(yuǎn)程主機(jī)ip private static final String USERNAME = ''; //登錄用戶名 private static final String PASSWORD = ''; //登陸密碼 private static final int REMOTE_PORT = 22; //ssh協(xié)議默認(rèn)端口 private static final int SESSION_TIMEOUT = 10000; //session超時(shí)時(shí)間 private static final int CHANNEL_TIMEOUT = 5000; //管道流超時(shí)時(shí)間 public static void main(String[] args) { String localFile = '/home/zimug/local/random.txt'; //本地文件路徑 String remoteFile = '/home/zimug/remote/targetfile.txt'; //上傳到遠(yuǎn)程的文件路徑,要保證登錄用戶有寫權(quán)限 Session jschSession = null; try { JSch jsch = new JSch(); jsch.setKnownHosts('/home/zimug/.ssh/known_hosts'); jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT); // 通過(guò)ssh私鑰的方式登錄認(rèn)證 // jsch.addIdentity('/home/zimug/.ssh/id_rsa'); // 通過(guò)密碼的方式登錄認(rèn)證 jschSession.setPassword(PASSWORD); jschSession.connect(SESSION_TIMEOUT); Channel sftp = jschSession.openChannel('sftp'); //建立sftp文件傳輸管道 sftp.connect(CHANNEL_TIMEOUT); ChannelSftp channelSftp = (ChannelSftp) sftp; // 傳輸本地文件到遠(yuǎn)程主機(jī) channelSftp.put(localFile, remoteFile); channelSftp.exit(); } catch (JSchException | SftpException e) { e.printStackTrace(); } finally { if (jschSession != null) {jschSession.disconnect(); } } System.out.println('文件傳輸完成!'); }}
3. JSch異常處理
在文件上傳的過(guò)程中,我們可能會(huì)遇到下面的一些異常
3.1UnknownHostKey異常
需要將遠(yuǎn)程服務(wù)器IP地址添加到known_hosts文件中。
$ ssh-keyscan -t rsa 1.2.3.4 >> ~/.ssh/known_hosts
3.2對(duì)于私鑰無(wú)效異常
有可能是遠(yuǎn)程服務(wù)器重新生成了私鑰,需要把私鑰分發(fā)復(fù)制到本地服務(wù)器。
ssh-copy-id -i ~/.ssh/id_rsa.pub <被分發(fā)的服務(wù)器ip>
3.3對(duì)于Auth fail異常
請(qǐng)確保提供的登錄密碼時(shí)正確的
com.jcraft.jsch.JSchException: Auth failat com.jcraft.jsch.Session.connect(Session.java:519)at com.zimug.io.howto.SFTPFileTransfer.main(SFTPFileTransfer.java:34)
作者:字母哥博客
以上就是如何在java中使用SFTP協(xié)議安全的傳輸文件的詳細(xì)內(nèi)容,更多關(guān)于Java 傳輸文件的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. .Net Core和RabbitMQ限制循環(huán)消費(fèi)的方法2. jsp網(wǎng)頁(yè)實(shí)現(xiàn)貪吃蛇小游戲3. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說(shuō)明4. ASP.NET MVC遍歷驗(yàn)證ModelState的錯(cuò)誤信息5. 用css截取字符的幾種方法詳解(css排版隱藏溢出文本)6. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向7. asp中response.write("中文")或者js中文亂碼問(wèn)題8. PHP設(shè)計(jì)模式中工廠模式深入詳解9. CSS hack用法案例詳解10. 將properties文件的配置設(shè)置為整個(gè)Web應(yīng)用的全局變量實(shí)現(xiàn)方法
