添加SSH库依赖
安卓项目需引入支持SSH协议的Java库(如JSch),可通过Maven或手动添加jar包:
// 在build.gradle中添加(需确认版本兼容性) implementation 'com.jcraft:jsch:0.1.55'
添加数据库驱动依赖
根据目标数据库类型选择驱动(如MySQL):
implementation 'mysql:mysql-connector-java:8.0.33'
配置AndroidManifest权限
<uses-permission android:name="android.permission.INTERNET" />
步骤 | 操作描述 | 关键代码片段 |
---|---|---|
建立SSH连接 | 使用JSch创建会话并认证 | “`java |
JSch jsch = new JSch();
Session session = jsch.getSession(username, host, port);
session.setPassword(password);
// 设置StrictHostKeyChecking为false(生产环境需配置已知主机密钥)
java.util.Properties config = new java.util.Properties();
config.put(“StrictHostKeyChecking”, “no”);
session.setConfig(config);
session.connect();
| 2. 设置本地端口转发 | 将远程数据库端口映射到本地端口 | ```java
int localPort = 3306; // 本地端口
int remotePort = 3306; // 远程数据库端口
session.setPortForwardingL(localPort, "localhost", remotePort);
``` |
| 3. 连接本地端口的数据库 | 通过本地端口访问映射后的数据库 | ```java
String url = "jdbc:mysql://localhost:" + localPort + "/dbname";
Connection conn = DriverManager.getConnection(url, dbUser, dbPass);
``` |
---
三、完整示例代码
```java
// 1. SSH连接与端口转发
public void connectSSHAndDB(String host, int port, String username, String password,
int localPort, int remotePort, String dbUrl, String dbUser, String dbPass) {
new Thread(() -> {
try {
JSch jsch = new JSch();
Session session = jsch.getSession(username, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
session.setPortForwardingL(localPort, "localhost", remotePort);
// 2. 连接数据库
String dbConnectionUrl = "jdbc:mysql://localhost:" + localPort + dbUrl;
Connection dbConn = DriverManager.getConnection(dbConnectionUrl, dbUser, dbPass);
// 执行数据库操作...
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
问题 | 原因 | 解决方案 |
---|---|---|
连接超时 | 网络不通/SSH认证失败 | 检查网络、用户名密码、防火墙规则 |
数据库拒绝连接 | 端口转发错误/数据库权限不足 | 确认setPortForwardingL 参数,检查数据库用户权限 |
ClassNotFoundException | 驱动未正确引入 | 确保mysql-connector-java 依赖已添加 |
解答:
使用JSch
的addIdentity()
方法加载私钥文件:
JSch jsch = new JSch(); Session session = jsch.getSession(username, host, port); session.addIdentity("path/to/private_key"); // 添加私钥 session.connect();
解答:
Session
实例。 ExecutorService
或协程(Kotlin)管理线程,防止阻塞主线程。 JSch
配置中启用压缩:config.put("compression.s2c", "zlib@openssh.com");