Java SSH连接

时间:2016-03-09 22:27:19

标签: java mysql ssh

如何从Java桌面应用程序连接到Internet服务器?我需要访问MySQL数据库并上传/下载文件。我拥有的主机(one.com),不支持远程数据库访问,所以我尝试使用SSH。我对此一无所知。我尝试了各种代码示例,但没有一个比连接更进一步。我将jsch.jar添加到我的项目中。还有什么我需要添加/安装或者我缺少的东西吗?

    public static void main(String args[])
    {
    String user = "user";
    String password = "pass";
    String host = "00.000.00.000";
    int port=22;

String remoteFile="/home/mywebsite.com/test.txt";

try
    {
    JSch jsch = new JSch();
    Session session = (Session) jsch.getSession(user, host, port);
        session.setPassword(password);
        session.setConfig("StrictHostKeyChecking", "no");
    System.out.println("Establishing Connection...");
    session.connect();
        System.out.println("Connection established.");
    System.out.println("Creating SFTP Channel.");
    ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
    sftpChannel.connect();
    System.out.println("SFTP Channel created.");


    InputStream out= null;
    out= sftpChannel.get(remoteFile);
    try (BufferedReader br = new BufferedReader(new InputStreamReader(out)))     {
        String line;
        while ((line = br.readLine()) != null)
            System.out.println(line);
    }
    }
catch(JSchException | SftpException | IOException e){System.err.print(e);}
}

我收到错误:

com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect
BUILD SUCCESSFUL (total time: 24 seconds)

或者我有什么其他选择来实现与我的网站的远程连接&数据库?

P.S。我已尝试过几乎所有来自stackoverflow的示例代码,并且所有代码都陷入了同一点......

谢谢!

2 个答案:

答案 0 :(得分:0)

Connection timed out表示您正在尝试连接到不接受端口22上的SSH连接的服务器,或者您的主机不正确。 host = "00.000.00.000";是您尝试连接的实际IP地址,还是您为Stack Overflow问题更改了它?

答案 1 :(得分:0)

我不打算调试你的代码,但会告诉你如何实现这个目标。

解决方案是使用SSH“端口转发”,您应首先从命令行设置,以便在将其嵌入Java代码之前了解其工作原理。如果命令行隧道就足够了,您可能不需要编写任何代码。

ssh -L3306:localhost:3306 <databaseHost>

这将从您的计算机端口3306到<databaseHost>创建一个SSH“隧道”,然后从localhost创建到<databaseHost>。您的计算机上与本地端口3306的任何连接都通过SSH隧道传输到<databaseHost>,然后通过端口3306连接到<databaseHost>知道的localHost,即返回自身。

当您的Java代码连接到数据库时,它应该连接到localhost:3306。请注意,数据库连接字符串中的localhost是指您的计算机,而ssh命令中的Connect to my computer port 3306 Intercepted by ssh Encrypted and transmitted to remote database server Decrypted by sshd and fed to port 3306 on the same server Received by MySQL running on the remote host 是从远程服务器的角度来看,因此它们意味着不同的东西。

总之,从Java代码到远程MySQL服务器的数据包通过以下路径:

ssh -L3306:10.0.0.3:3306 gateway.xyz.com

对于返回数据包,此过程相反,由本地ssh客户端和远程sshd守护程序管理。

请注意,这可用于更有趣的案例。例如,假设远程ssh服务器和数据库服务器位于同一防火墙后面的不同系统上。假设ssh主机显示为gateway.xyz.com,而数据库主机位于10.0.0.3的内部LAN上,无法从Internet访问,但可以从网关访问。

Your computer 3306
Received by ssh
Encryption and sent to gateway.xyz.com
Decrypted by sshd forwarded to 10.0.0.3:3306
Received at 10.0.0.3:3306 by MySQL

然后分组路由

$('.main-nav a').each(function(){
    var myHref= $(this).attr('href');
    if(url.match(myHref)) {
        $('.accordion').foundation('down', $('.accordion .accordion-item.is-active .accordion-content'));
    }
});

要清楚,这是您在执行Java代码之前从命令行设置的,这应该发生在与ssh命令不同的会话中。只要ssh命令正在运行,隧道就可用。