通过jsch将ssh连接到Java中的Unix服务器

通过jsch将ssh连接到Java中的Unix服务器,java,unix,jsch,Java,Unix,Jsch,对于我从一台Unix服务器到另一台Unix服务器的ssh连接,我真的感到很震惊,也没有什么想法了。这是我在Unix服务器之间建立ssh连接的java代码: import com.jcraft.jsch.*; import java.util.Properties; public class ScpFiles { public static void main(String[] arg){ // TODO code application logic here JSc

对于我从一台Unix服务器到另一台Unix服务器的ssh连接,我真的感到很震惊,也没有什么想法了。这是我在Unix服务器之间建立ssh连接的java代码:

import com.jcraft.jsch.*;
import java.util.Properties;

public class ScpFiles {    
  public static void main(String[] arg){
    // TODO code application logic here
    JSch jsch = null;
    Session session = null;
    Channel channel = null;

    String userName = "a_user";
    String host = "unixserver1";
    String pass = "";
    String phrase = "";
    String knownHostFile = "/home/a_user/.ssh/known_hosts";
    String rsa = "/home/a_user/.ssh/id_rsa";

    try{
        jsch = new JSch();
        session = jsch.getSession(userName, host, 22);
        session.setPassword(pass);
        jsch.addIdentity(rsa, phrase.getBytes());
        jsch.setKnownHosts(knownHostFile);
        //Properties prop = new Properties();
        //prop.put("StrictHostKeyChecking", "no");
        //session.setConfig(prop);
        session.connect();
        channel.connect();
        String command = "an unix command";
        channel = session.openChannel("exec");
        ((ChannelExec)channel).setCommand(command);
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        channel.disconnect();
        session.disconnect();
    }
  }
}
正如你所看到的,这是非常直截了当的,但不知何故,它总是以以下错误结束:

com.jcraft.jsch.JSchException: Auth cancel
    at com.jcraft.jsch.Session.connect(Session.java:463)
    at com.jcraft.jsch.Session.connect(Session.java:158)
    at ScpFiles.main(ScpFiles.java:43)
线程“main”java.lang.NullPointerException中出现异常 位于ScpFiles.main(ScpFiles.java:53)

我甚至试图通过将StrictHostKeyChecking设置为no来降低测试的安全性,但我仍然无法通过ssh连接到远程unix服务器

有几天我在谷歌上搜索了这个错误,但听起来上面的答案并不能解决我的问题,这里的人能告诉我哪里出了问题吗


感谢堆。

正如我从您的代码中看到的,您在使用通道时仍然为空:

channel.connect();
和后面的第2行:

channel = session.openChannel("exec");

我认为您需要删除通道。connect();行,您的程序应该可以运行。

scp将是代码成功通过ssh连接到远程unix服务器后的下一个短语。NullPointerException是由channel.disconnect()引起的;由于ssh连接根本没有建立,因此它会抛出该错误,但这不是这里的重点,重点是它无法建立ssh连接。感谢Martin,我将首选身份验证设置为密码,但我收到一个新错误:
com.jcraft.jsch.JSchException:Auth fail at com.jcraft.jsch.Session.connect(Session.java:464)在com.jcraft.jsch.Session.connect(Session.java:158)在ScpFiles.main(ScpFiles.java:44)上
我非常确定用户名和密码是正确的,因为ssh命令工作得很好。我将尝试获取日志文件,看看到底出了什么问题。虽然这确实是真的,但异常是由
se引发的session.connect()
,因此执行永远不会到达
通道。connect()
。我测试了该类,使用该行我得到了与OP相同的异常。删除它后,该类工作正常。什么“相同的异常”?OP发布了三个不同的异常。
JSchException
:Auth cancel、
NullPointerException
JSchException
:Auth fail。NullPointerException.@MartinPrikryl我不知道OP中的案例是否存在其他配置问题,但这些问题将无法调查,因为它们与详细信息相关OP writer不想公开共享的内容。无论如何,修复此部分可能有助于解决这些问题(如果有)。