Java利用JSch實(shí)現(xiàn)SSH遠(yuǎn)程操作的技術(shù)指南
1、簡(jiǎn)述
在日常開發(fā)中,許多應(yīng)用需要通過 SSH 協(xié)議遠(yuǎn)程連接服務(wù)器來執(zhí)行命令、上傳或下載文件。JSch (Java Secure Channel) 是一個(gè)功能強(qiáng)大的 Java 庫,它提供了便捷的接口來實(shí)現(xiàn) SSH 連接、SFTP 文件傳輸和其他遠(yuǎn)程管理功能。
2、核心功能
- SSH 遠(yuǎn)程命令執(zhí)行:通過 SSH 協(xié)議在遠(yuǎn)程服務(wù)器上運(yùn)行命令。
- SFTP 文件傳輸:支持上傳和下載文件。
- 端口轉(zhuǎn)發(fā):支持本地端口和遠(yuǎn)程端口轉(zhuǎn)發(fā)。
- 密鑰登錄:支持通過密碼和私鑰進(jìn)行認(rèn)證。
在使用 JSch 之前,需要添加其依賴。以下是 JSch 的 Maven 依賴:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
3、使用實(shí)例
3.1 遠(yuǎn)程執(zhí)行命令
以下代碼展示如何通過 SSH 連接到遠(yuǎn)程服務(wù)器并執(zhí)行命令:
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.InputStream;
public class JSchExecExample {
public static void main(String[] args) {
String host = "your-server-ip";
String user = "your-username";
String password = "your-password";
try {
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
// 忽略主機(jī)密鑰檢查
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
// 打開執(zhí)行命令的通道
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand("ls -l");
// 獲取命令輸出
InputStream inputStream = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1024];
while (inputStream.read(tmp) != -1) {
System.out.print(new String(tmp));
}
channel.disconnect();
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.2 上傳文件到遠(yuǎn)程服務(wù)器 (SFTP)
以下代碼展示如何通過 SFTP 上傳文件:
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class JSchSFTPUploadExample {
public static void main(String[] args) {
String host = "your-server-ip";
String user = "your-username";
String password = "your-password";
String localFile = "/path/to/local/file.txt";
String remoteDir = "/path/to/remote/dir/";
try {
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
// 忽略主機(jī)密鑰檢查
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
// 打開 SFTP 通道
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
// 上傳文件
channel.put(localFile, remoteDir);
System.out.println("File uploaded successfully!");
channel.disconnect();
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.3 下載文件到本地 (SFTP)
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class JSchSFTPDownloadExample {
public static void main(String[] args) {
String host = "your-server-ip";
String user = "your-username";
String password = "your-password";
String remoteFile = "/path/to/remote/file.txt";
String localDir = "/path/to/local/dir/";
try {
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
// 忽略主機(jī)密鑰檢查
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
// 打開 SFTP 通道
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
// 下載文件
channel.get(remoteFile, localDir);
System.out.println("File downloaded successfully!");
channel.disconnect();
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.4 使用私鑰進(jìn)行認(rèn)證
如果需要使用私鑰而不是密碼進(jìn)行認(rèn)證,可以如下設(shè)置:
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.InputStream;
public class JSchPrivateKeyExample {
public static void main(String[] args) {
String host = "your-server-ip";
String user = "your-username";
String privateKey = "/path/to/private/key";
try {
JSch jsch = new JSch();
jsch.addIdentity(privateKey);
Session session = jsch.getSession(user, host, 22);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand("ls -l");
InputStream inputStream = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1024];
while (inputStream.read(tmp) != -1) {
System.out.print(new String(tmp));
}
channel.disconnect();
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.5 本地端口轉(zhuǎn)發(fā)
通過 JSch 實(shí)現(xiàn)本地端口轉(zhuǎn)發(fā),可以讓本地端口訪問遠(yuǎn)程服務(wù):
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class JSchPortForwarding {
public static void main(String[] args) {
String host = "your-server-ip";
String user = "your-username";
String password = "your-password";
try {
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
// 設(shè)置本地端口轉(zhuǎn)發(fā)
int assignedPort = session.setPortForwardingL(8888, "localhost", 8080);
System.out.println("Local port forwarding: localhost:" + assignedPort + " -> localhost:8080");
// 保持連接
Thread.sleep(60000);
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、總結(jié)
以上JSch常見的使用樣例,JSch常見的使用場(chǎng)景是自動(dòng)化遠(yuǎn)程管理、文件傳輸、構(gòu)建SSH隧道等。以下是JSch 的優(yōu)勢(shì):
- 輕量級(jí):?jiǎn)蝹€(gè) JAR 包即可使用。
- 功能豐富:支持 SSH、SFTP、端口轉(zhuǎn)發(fā)等多種功能。
- 開源免費(fèi):無額外成本。
到此這篇關(guān)于Java利用JSch實(shí)現(xiàn)SSH遠(yuǎn)程操作的技術(shù)指南的文章就介紹到這了,更多相關(guān)Java JSch SSH遠(yuǎn)程操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于IDEA關(guān)聯(lián)數(shù)據(jù)庫的問題
這篇文章主要介紹了IDEA關(guān)聯(lián)數(shù)據(jù)庫的相關(guān)知識(shí),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Spring Boot管理用戶數(shù)據(jù)的操作步驟
SpringBoot結(jié)合Thymeleaf模板引擎,可以快速搭建Web應(yīng)用,介紹了使用SpringBoot處理JSON數(shù)據(jù)的基本過程,包括創(chuàng)建實(shí)體類、視圖頁面和控制器,通過這些步驟,即可完成基于SpringBoot和Thymeleaf的簡(jiǎn)單Web開發(fā),感興趣的朋友跟隨小編一起看看吧2024-09-09
雙token實(shí)現(xiàn)token超時(shí)策略示例
用于restful的app應(yīng)用無狀態(tài)無sesion登錄示例,需要的朋友可以參考下2014-02-02
基于Spring AOP實(shí)現(xiàn)日志自動(dòng)打印功能
這篇文章主要介紹了基于Spring AOP實(shí)現(xiàn)日志自動(dòng)打印功能,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2025-01-01
關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題
這篇文章主要介紹了關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
使用Java和SpringBoot實(shí)現(xiàn)服務(wù)器發(fā)送事件(Server-Sent Events)
使用Java開發(fā)web應(yīng)用,大多數(shù)時(shí)候我們提供的接口返回?cái)?shù)據(jù)都是一次性完整返回,有些時(shí)候,我們也需要提供流式接口持續(xù)寫出數(shù)據(jù),以下提供一種簡(jiǎn)單的方式,本文給大家介紹了如何在Java web中實(shí)現(xiàn)服務(wù)器發(fā)送事件,需要的朋友可以參考下2024-02-02

