使用com.jcraft.jsch進行SSH連接

一、引言

在開發網路應用程序時,我們經常需要使用到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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 14:07
下一篇 2024-12-25 14:07

相關推薦

  • com.alipay.sofa.bolt框架

    com.alipay.sofa.bolt框架是一款高性能、輕量級、可擴展的RPC框架。其廣泛被應用於阿里集團內部服務以及阿里雲上的服務。該框架通過NIO支持高並發,同時還內置了多種…

    編程 2025-04-29
  • Python SSH 遠程執行命令

    Python SSH 遠程執行命令是指在一個伺服器上執行遠程另一個伺服器上命令。如果你需要在本地機器上執行命令,或者在遠程機器上執行本地命令,你都可以使用 SSH。在 Python…

    編程 2025-04-29
  • CentOS 開啟 SSH

    一、安裝 SSH SSH 是 Secure Shell 的縮寫,是一種安全協議。在 CentOS 系統中,可以通過以下命令安裝 SSH: sudo yum install open…

    編程 2025-04-25
  • com.picacomic.fregata

    一、介紹 Com.picacomic.fregata是一個基於Java的機器學習庫,旨在提供易於使用的API來開發各種機器學習模型。 在最初的版本中,com.picacomic.f…

    編程 2025-04-25
  • 如何開啟SSH服務

    一、SSH是什麼 SSH(Secure Shell)是加密網路協議,用於在網路上安全地傳輸數據。它通過加密技術來保護數據的機密性和完整性,可以被用於遠程登錄(以及其他網路服務)的安…

    編程 2025-04-25
  • 詳解Git生成SSH Key

    一、生成SSH Key的意義 Git是一個強大的分散式版本控制系統,可以幫助我們開發更加高效和規範化。在使用Git和GitHub等平台時,常常會涉及SSH Key的生成。那麼,什麼…

    編程 2025-04-24
  • 深入探究SSH協議

    一、SSH協議的概述 Secure Shell(SSH)是一種加密網路協議,用於在網路上安全地傳輸數據。它最初是為取代Telnet和不安全的遠程Shell協議(例如rlogin)而…

    編程 2025-04-23
  • 訪問github.com的請求遭到拒絕

    一、網路問題導致訪問失敗 訪問github.com的請求遭到拒絕,可能是由於網路問題導致的。首先,我們需要檢查網路是否正常,例如檢查網路連接是否斷開,檢查是否有代理設置等。如果網路…

    編程 2025-04-23
  • CentOS7 SSH詳解

    一、CentOS7 SSH簡介 CentOS7是一種在Linux環境下運行的操作系統,而SSH(Secure Shell)是一種用於遠程登錄到計算機系統的協議。在CentOS7中,…

    編程 2025-04-23
  • GitLab設置SSH key

    一、為什麼需要添加SSH key GitLab是一個基於Git的源代碼管理系統,使用它可以輕鬆地管理代碼、項目和團隊。在GitLab上添加SSH key是為了保證賬戶的安全性,同時…

    編程 2025-04-23

發表回復

登錄後才能評論