Java 我们可以使用JSch进行基于SSH密钥的通信吗?

Java 我们可以使用JSch进行基于SSH密钥的通信吗?,java,ssh,jsch,Java,Ssh,Jsch,我使用的是sftp通信,现在我想使用方便的基于密钥的身份验证,密钥由我的网络团队加载到客户端和服务器机器上一次,所有后续通信将仅基于用户,我们已加载密钥 sftp -oPort=10022 jmark@192.18.0.246 astjill@192.18.0.135 像这个命令一样,它可以很好地工作并连接到sftp,我如何通过编程实现这个功能 如果无法使用JSch,请建议使用其他库。我遇到了。这是可能的。看看 这允许您将密钥用作字节数组或从文件中读取它 import com.jcraft.j

我使用的是sftp通信,现在我想使用方便的基于密钥的身份验证,密钥由我的网络团队加载到客户端和服务器机器上一次,所有后续通信将仅基于用户,我们已加载密钥

sftp -oPort=10022 jmark@192.18.0.246
as
tjill@192.18.0.135

像这个命令一样,它可以很好地工作并连接到sftp,我如何通过编程实现这个功能


如果无法使用JSch,请建议使用其他库。我遇到了。

这是可能的。看看

这允许您将密钥用作字节数组或从文件中读取它

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class UserAuthPubKey {
    public static void main(String[] arg) {
        try {
            JSch jsch = new JSch();

            String user = "tjill";
            String host = "192.18.0.246";
            int port = 10022;
            String privateKey = ".ssh/id_rsa";

            jsch.addIdentity(privateKey);
            System.out.println("identity added ");

            Session session = jsch.getSession(user, host, port);
            System.out.println("session created.");

            // disabling StrictHostKeyChecking may help to make connection but makes it insecure
            // see http://stackoverflow.com/questions/30178936/jsch-sftp-security-with-session-setconfigstricthostkeychecking-no
            // 
            // java.util.Properties config = new java.util.Properties();
            // config.put("StrictHostKeyChecking", "no");
            // session.setConfig(config);

            session.connect();
            System.out.println("session connected.....");

            Channel channel = session.openChannel("sftp");
            channel.setInputStream(System.in);
            channel.setOutputStream(System.out);
            channel.connect();
            System.out.println("shell channel connected....");

            ChannelSftp c = (ChannelSftp) channel;

            String fileName = "test.txt";
            c.put(fileName, "./in/");
            c.exit();
            System.out.println("done");

        } catch (Exception e) {
            System.err.println(e);
        }
    }
}

系统中的预加载可能意味着它是
.ssh/id\u rsa
或类似的,或者主机的
.ssh/config
中有一个特殊设置,或者您正在使用一些程序,如
ssh\u agent
按需提供密钥。探索适合您的案例,并将其添加到您的问题中。在我的案例中,我还需要提供UserInfo:
session.setUserInfo(UserInfo)
。没有它,我得到的是
jscheexception:USERAUTH fail
@Betlista当您使用
ssh-I
时,如果不指定用户名,它将使用客户端计算机上帐户的用户名。因此,如果您以steve@client,这就像说
ssh-i/path/to/private\u-keysteve@remote
@Martin-我更新了代码示例,并链接到您的答案。现在应该很清楚,禁用StrictHostKeyChecking是不安全的。只需添加:还有一个
addIdentity()
方法接受密钥和密钥短语,因此您不需要处理
UserInfo
-对象