背景
我们往往在云服务创建的数据库,如mysql,redis一般都是给内部私有网络访问的,有时候我们想查看数据或者调整数据的时候,可能会通过ssh连接上服务器后敲命令,或者公网开放数据库端口访问,通过电脑软件可视乎操作,最后关闭端口访问权限。这些方式操作起来都很麻烦,我们可以通过ssh的端口转发解决。
ssh端口转发
通过cmd命令执行,确定验证输入ssh密码即可
# 访问本地3306等于ssh连接上服务器后访问localhost服务器上的3306端口
ssh -L 3306:localhost:3306 root@192.168.1.101
在执行cmd命令查看端口,你会发现本地有3306端口
#查询3306端口应用信息
netstat -ano | findstr 3306
这时候你连接本地的3306,就是连接云服务器上的数据库了
嫌频繁输入密码,我们可以java程序去执行,maven引用jcraft
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
Java代码
//ssh服务器ip
String sshHost = "192.168.1.101";
//ssh服务器用户名
String sshUsername = "root";
//ssh服务器密码
String sshPassword = "12345678";
//ssh服务器端口
int sshPort = 22;
//本地端口
int localPort = 3306;
//远程服务器ip
String remoteHost = "127.0.0.1";
//远程服务器端口
int remotePort = 3306; // Example: MySQL default port
try {
JSch jsch = new JSch();
Session session = jsch.getSession(sshUsername, sshHost, sshPort);
session.setPassword(sshPassword);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
int assignedPort = session.setPortForwardingL(localPort, remoteHost, remotePort);
System.out.println("SSH Tunnel established with success!");
System.out.println("Local Port: " + assignedPort + " forwarded to " + remoteHost + ":" + remotePort);
//等待输入结束
Scanner scanner = new Scanner(System.in);
scanner.nextLine();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
}