העברת קובץ באמצעות SFTP בג'אווה
1. סקירה כללית
במדריך זה, נדון כיצד להעלות ולהוריד קבצים משרת מרוחק באמצעות SFTP ב- Java.
נשתמש בשלוש ספריות שונות: JSch, SSHJ ו- Apache Commons VFS.
2. שימוש ב- JSch
ראשית, בואו נראה כיצד להעלות ולהוריד קבצים משרת מרוחק באמצעות ספריית JSch.
2.1. תצורת Maven
נצטרך להוסיף את jsch תלות שלנו pom.xml:
com.jcraft jsch 0.1.55
הגרסה האחרונה של jsch ניתן למצוא ב Maven Central.
2.2. הגדרת JSch
כעת, נגדיר את JSch.
JSch מאפשר לנו להשתמש באימות סיסמאות או באימות מפתח ציבורי כדי לגשת לשרת מרוחק. בדוגמה זו, נשתמש באימות סיסמה:
פרטי ChannelSftp setupJsch () זורק את JSchException {JSch jsch = JSch חדש (); jsch.setKnownHosts ("/ משתמשים / john / .ssh / known_hosts"); מושב jschSession = jsch.getSession (שם משתמש, remoteHost); jschSession.setPassword (סיסמה); jschSession.connect (); return (ChannelSftp) jschSession.openChannel ("sftp"); }
בדוגמה לעיל, remoteHost מייצג את השם או את כתובת ה- IP של השרת המרוחק (כלומר example.com). אנו יכולים להגדיר את המשתנים המשמשים במבחן כ:
מחרוזת פרטית remoteHost = "HOST_NAME_HERE"; שם משתמש פרטי מחרוזת = "USERNAME_HERE"; סיסמת מחרוזת פרטית = "PASSWORD_HERE";
כמו כן, אנו יכולים ליצור את ידועים_מארחים קובץ באמצעות הפקודה הבאה:
ssh-keyscan -H -t rsa REMOTE_HOSTNAME >> ידועים_מארחים
2.3. העלאת קובץ עם JSch
עַכשָׁיו, כדי להעלות קובץ לשרת המרוחק, נשתמש בשיטה ChannelSftp.put ():
@Test ציבורי בטל כאשר UploadFileUsingJsch_thenSuccess () זורק JSchException, SftpException {ChannelSftp channelSftp = setupJsch (); channelSftp.connect (); מחרוזת localFile = "src / main / resources / sample.txt"; מחרוזת remoteDir = "remote_sftp_test /"; channelSftp.put (localFile, remoteDir + "jschFile.txt"); channelSftp.exit (); }
בדוגמה זו, הפרמטר הראשון של השיטה מייצג את הקובץ המקומי שיועבר, למשל, src / main / resources / sample.txt, בזמן remoteDir הוא הנתיב של ספריית היעד בשרת המרוחק.
2.4. הורדת קובץ עם JSch
אנחנו יכולים גם להוריד קובץ מהשרת המרוחק באמצעות ChannelSftp.get ():
@ מבחן ציבורי בטל כאשרDownloadFileUsingJsch_thenSuccess () זורק JSchException, SftpException {ChannelSftp channelSftp = setupJsch (); channelSftp.connect (); מחרוזת remoteFile = "welcome.txt"; מחרוזת localDir = "src / main / resources /"; channelSftp.get (remoteFile, localDir + "jschFile.txt"); channelSftp.exit (); }
ה remoteFile הוא הנתיב של הקובץ להורדה, ו localDir מייצג את הנתיב של ספריית היעד המקומית:
3. שימוש ב- SSHJ
לאחר מכן נשתמש בספריית SSHJ להעלאת ולהורדת קבצים משרת מרוחק.
3.1. תצורת Maven
ראשית, נוסיף את התלות שלנו pom.xml:
com.hierynomus sshj 0.27.0
הגרסה האחרונה של sshj ניתן למצוא ב Maven Central.
3.2. הגדרת SSHJ
הַבָּא, נגדיר את SSHClient.
SSHJ גם מאפשר לנו להשתמש בסיסמה או אימות מפתח ציבורי כדי לגשת לשרת המרוחק.
נשתמש באימות סיסמאות בדוגמה שלנו:
פרטי SSHClient setupSshj () זורק IOException {לקוח SSHClient = SSHClient חדש (); client.addHostKeyVerifier (חדש PromiscuousVerifier ()); client.connect (remoteHost); client.authPassword (שם משתמש, סיסמה); לקוח חוזר; }
3.3. העלאת קובץ עם SSHJ
בדומה ל- JSch, נשתמש ב- SFTPClient.put () שיטה להעלאת קובץ לשרת המרוחק:
@ מבחן ציבורי בטל כאשר UploadFileUsingSshj_thenSuccess () זורק IOException {SSHClient sshClient = setupSshj (); SFTPClient sftpClient = sshClient.newSFTPClient (); sftpClient.put (localFile, remoteDir + "sshjFile.txt"); sftpClient.close (); sshClient.disconnect (); }
יש לנו שני משתנים חדשים להגדרה:
מחרוזת פרטית localFile = "src / main / resources / input.txt"; מחרוזת פרטית remoteDir = "remote_sftp_test /";
3.4. הורדת קובץ עם SSHJ
כנ"ל לגבי הורדת קובץ מהשרת המרוחק - נשתמש בו SFTPClient.get ():
@Test ציבורי בטל כאשרDownloadFileUsingSshj_thenSuccess () זורק IOException {SSHClient sshClient = setupSshj (); SFTPClient sftpClient = sshClient.newSFTPClient (); sftpClient.get (remoteFile, localDir + "sshjFile.txt"); sftpClient.close (); sshClient.disconnect (); }
ונוסיף את שני המשתנים המשמשים לעיל:
פרטי מחרוזת remoteFile = "welcome.txt"; מחרוזת פרטית localDir = "src / main / resources /";
4. שימוש ב- Apache Commons VFS
לבסוף, נשתמש ב- Apache Commons VFS להעברת קבצים לשרת מרוחק.
בעצם, Apache Commons VFS משתמש בספריית JSch באופן פנימי.
4.1. תצורת Maven
עלינו להוסיף את commons-vfs2 תלות שלנו pom.xml:
org.apache.commons commons-vfs2 2.4
הגרסה האחרונה של commons-vfs2 ניתן למצוא ב Maven Central.
4.2. העלאת קובץ עם Apache Commons VFS
Apache Commons VFS הוא קצת שונה.
נשתמש ב- FileSystemManager ליצור FileObjects מקבצי היעד שלנו, ואז השתמש ב- FileObjectלהעביר את הקבצים שלנו.
בדוגמה זו נעלה קובץ בשיטה FileObject.copyFrom ():
@Test ציבורי בטל כאשר UploadFileUsingVfs_thenSuccess () זורק IOException {מנהל FileSystemManager = VFS.getManager (); FileObject local = manager.resolveFile (System.getProperty ("user.dir") + "/" + localFile); FileObject מרחוק = manager.resolveFile ("sftp: //" + שם משתמש + ":" + סיסמה + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt"); remote.copyFrom (מקומי, Selectors.SELECT_SELF); local.close (); remote.close (); }
שים לב שנתיב הקבצים המקומי צריך להיות מוחלט ונתיב הקבצים המרוחק צריך להתחיל איתו sftp: // שם משתמש: [מוגן בדוא"ל]
4.3. הורדת קובץ עם Apache Commons VFS
הורדת קובץ משרת מרוחק דומה מאוד - נשתמש גם FileObject.copyFrom () להעתיק localFile מ remoteFile:
@Test ציבורי בטל כאשרDownloadFileUsingVfs_thenSuccess () זורק IOException {מנהל FileSystemManager = VFS.getManager (); FileObject local = manager.resolveFile (System.getProperty ("user.dir") + "/" + localDir + "vfsFile.txt"); FileObject remote = manager.resolveFile ("sftp: //" + שם משתמש + ":" + סיסמא + "@" + remoteHost + "/" + remoteFile); local.copyFrom (מרחוק, Selectors.SELECT_SELF); local.close (); remote.close (); }
5. מסקנה
במאמר זה למדנו כיצד להעלות ולהוריד קבצים משרת SFTP מרוחק ב- Java. לשם כך השתמשנו במספר ספריות: JSch, SSHJ ו- Apache Commons VFS.
קוד המקור המלא ניתן למצוא באתר GitHub.