【发布时间】:2016-11-29 11:49:49
【问题描述】:
我是 ssh 新手,我有一个问题。 我必须通过 ssh 连接到网关,并且在 ssh 会话中我必须通过 ssh 连接到另一台服务器。 只有这样我才能连接到 mySQL 服务器。
ssh <gateway>ssh -L3306:db02:3306 username@db02
然后我可以配置 Putty 和 HeidySQL 来访问 mySQL 数据库。 到目前为止,一切顺利。
但现在我想通过 java 代码访问 mySQL 数据库。 我google了一下,找到了一些使用Jsch的代码。
所以,下面是代码的结果。 但是当我运行代码时,会话没问题,端口转发也没问题。
但这部分给了我一个错误:
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:"+nLocalPort, strDbUser, strDbPassword);
这是错误:java.sql.SQLException: Access denied for user 'dbUser'@'gateway.appl.local'(使用密码:YES)
似乎端口转发未完成,因为它显示连接到网关的错误:'dbUser'@'gateway.appl.local'
成功完成端口转发后,它应该显示如下内容:dbUser'@'**db02**.appl.local
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class MySqlConnOverSSH {
private static void doSshTunnel( String strSshUser, String strSshPassword, String strSshHost, int nSshPort, String strRemoteHost, int nLocalPort, int nRemotePort ) throws JSchException
{
final JSch jsch = new JSch();
Session session = jsch.getSession( strSshUser, strSshHost, 22 );
session.setPassword( strSshPassword );
final Properties config = new Properties();
config.put( "StrictHostKeyChecking", "no" );
session.setConfig( config );
session.connect();
session.setPortForwardingL(nLocalPort, strRemoteHost, nRemotePort);
}
/**
* Java Program to connect to remote database through SSH using port forwarding
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
try
{
String strSshUser = "sshUserName"; // SSH loging username
String strSshPassword = "sshPassWord"; // SSH login password
String strSshHost = "10.20.0.234"; // hostname or ip or SSH server
int nSshPort = 22; // remote SSH host port number
String strRemoteHost = "db02"; // hostname or ip of your database server
int nLocalPort = 3307; // local port number use to bind SSH tunnel
int nRemotePort = 3306; // remote port number of your database
String strDbUser = "dbUser"; // database loging username
String strDbPassword = "dbUserPW"; // database login password
MySqlConnOverSSH.doSshTunnel(strSshUser, strSshPassword, strSshHost, nSshPort, strRemoteHost, nLocalPort, nRemotePort);
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:"+nLocalPort, strDbUser, strDbPassword);
con.close();
}
catch( Exception e )
{
e.printStackTrace();
}
finally
{
System.exit(0);
}
}
}
【问题讨论】:
-
你不想这样做,它会非常慢
-
如果两个人想要做你在第二步中描述的端口转发会发生什么?
-
伙计们,我对 shh 完全陌生。所以,请提供一个替代方案,我可以如何实现这一点。我很感谢以正确的方式提供的每一个小帮助。