一、引言
在開發網路應用程序時,我們經常需要使用到SSH連接來與遠程伺服器進行交互。而JSCH是一個Java Secure Channel的縮寫,它提供了直接連接SSH的能力,使得我們可以在Java應用程序中進行SSH連接,而不需要額外的工具或軟體。
二、JSCH的安裝和配置
在開始使用JSCH之前,我們需要進行JSCH的安裝和配置。JSCH的安裝非常簡單,只需要將它的JAR包添加到我們的項目中即可。我們可以從以下地址下載到JSCH的JAR包:
下載完成後,我們可以將JAR包添加到我們的項目中。在Eclipse中,我們可以右鍵單擊項目名,選擇Build Path -> Configure Build Path,然後在彈出窗口的Libraries選項卡中選擇Add External JARs來將JSCH的JAR包添加進來。
三、連接SSH伺服器
在JSCH中,我們需要使用Session來建立SSH連接,並使用Channel來執行相關的操作。下面就讓我們來看看如何使用JSCH連接SSH伺服器。
import com.jcraft.jsch.*; public class SSHConnection { public static void main(String[] args) { String user = "username"; String password = "password"; String host = "example.com"; int port = 22; JSch jsch = new JSch(); Session session = null; try { session = jsch.getSession(user, host, port); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword(password); session.connect(); Channel channel = session.openChannel("shell"); channel.setInputStream(System.in); channel.setOutputStream(System.out); channel.connect(); } catch (JSchException e) { e.printStackTrace(); } } }
在上面的代碼中,我們使用JSch的getSession方法來創建一個Session對象,其中user、host和port分別代表我們要連接的SSH伺服器的用戶名、主機名和埠號,而password則代表伺服器的密碼。我們還需要設置StrictHostKeyChecking配置,這樣我們才能夠連接到未知主機。最後,我們調用session的connect方法來建立SSH連接。
接下來,我們使用session的openChannel方法來打開一個Channel對象,在本例中,我們選擇了shell類型的Channel。我們還需要設置Channel的輸入輸出流,以便我們可以像在命令行中一樣與伺服器進行交互。最後,我們調用Channel的connect方法來完成SSH連接。
四、SSH連接進階應用
除了連接SSH伺服器之外,JSCH還提供了許多進階應用。以下是一些常見的應用場景:
1. 使用SFTP進行文件傳輸
除了SSH連接之外,JSCH還提供了SFTP的支持,用來進行文件傳輸。以下是一個SFTP傳輸文件的例子:
import com.jcraft.jsch.*; public class SFTP { public static void main(String[] args) { String user = "username"; String password = "password"; String host = "example.com"; int port = 22; JSch jsch = new JSch(); Session session = null; try { session = jsch.getSession(user, host, port); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword(password); session.connect(); ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp"); sftpChannel.connect(); sftpChannel.put("C:\\localfile.txt", "/remotefile.txt"); sftpChannel.disconnect(); } catch (JSchException | SftpException e) { System.err.println(e); } } }
在上面的代碼中,我們首先建立了一個SSH連接,然後調用session的openChannel方法來打開一個SFTP類型的Channel,並且連接到伺服器。接下來,我們調用ChannelSftp對象的put方法來將本地的文件localfile.txt上傳到伺服器上的remotefile.txt。最後,我們關閉Channel並且退出SSH連接。
2. 使用SCP進行文件傳輸
除了SFTP之外,JSCH還提供了SCP的支持,用來進行文件傳輸。以下是一個SCP傳輸文件的例子:
import com.jcraft.jsch.*; public class SCP { public static void main(String[] args) { String user = "username"; String password = "password"; String host = "example.com"; int port = 22; JSch jsch = new JSch(); Session session = null; try { session = jsch.getSession(user, host, port); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword(password); session.connect(); Channel channel = session.openChannel("exec"); String command = "scp -t /remote/folder/"; ((ChannelExec) channel).setCommand(command); OutputStream out = channel.getOutputStream(); InputStream in = channel.getInputStream(); channel.connect(); String localFile = "/local/folder/file.txt"; File file = new File(localFile); if (file.exists()) { // send "C0644 filesize filename", where filename should not include '/' long filesize = file.length(); command = "C0644 " + filesize + " "; if (localFile.lastIndexOf('/') > 0) { command += localFile.substring(localFile.lastIndexOf('/') + 1); } else { command += localFile; } command += "\n"; out.write(command.getBytes()); out.flush(); // send a content of lfile FileInputStream fis = new FileInputStream(localFile); byte[] buf = new byte[1024]; while (true) { int len = fis.read(buf, 0, buf.length); if (len <= 0) { break; } out.write(buf, 0, len); } fis.close(); // send '\0' buf[0] = 0; out.write(buf, 0, 1); out.flush(); if (checkAck(in) != 0) { System.exit(0); } } channel.disconnect(); } catch (JSchException | IOException e) { e.printStackTrace(); } } static int checkAck(InputStream in) throws IOException { int b = in.read(); if (b == 0) return b; if (b == -1) return b; if (b == 1 || b == 2) { StringBuffer sb = new StringBuffer(); int c; do { c = in.read(); sb.append((char) c); } while (c != '\n'); if (b == 1) { // error System.out.print(sb.toString()); } if (b == 2) { // fatal error System.out.print(sb.toString()); } } return b; } }
在上面的代碼中,我們首先建立了一個SSH連接,然後打開一個exec類型的Channel。我們將要傳輸到伺服器上的文件名設置為/remote/folder/file.txt,並且使用OutputStream將命令發送給伺服器。接著,我們設置InputStream和OutputStream,然後連接Channel。
在連接之後,我們檢查本地文件是否存在,如果存在,則將文件發送到伺服器上。我們通過一個循環來將文件發送到伺服器上,並且檢查發送的結果。最後,我們關閉Channel並且退出SSH連接。
五、總結
在本文中,我們學習了如何使用JSCH連接SSH伺服器,同時還介紹了SFTP和SCP的使用方法。希望這篇文章能夠幫助你學習和使用JSCH。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/291797.html