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

Ahm*_*eem 38 java ssh jsch

我正在使用JSch进行sftp通信,现在我想使用方便基于密钥的身份验证,密钥由我的网络团队一次加载到客户端和服务器机器上,所有后来的通信都只是基于用户的,我们已经加载了密钥.

sftp -oPort=10022 jmark@192.18.0.246
Run Code Online (Sandbox Code Playgroud)

tjill@192.18.0.135

像这个命令工作正常并连接到sftp,我如何以编程方式实现此功能.

如果不可能使用JSch,请建议其他一些库.我遇到了Apache SSHD.

Arn*_*cek 87

有可能的.看一下JSch.addIdentity(...)

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在我的情况下,我还需要提供UserInfo:`session.setUserInfo(userinfo)`.没有它,我得到`JSchException:USERAUTH fail` (5认同)
  • @Betlista当您使用`ssh -i`而未指定用户名时,它使用客户端计算机上帐户的用户名.所以,如果你以steve @ client身份登录,就像是说'ssh -i/path/to/private_key steve @ remote`. (2认同)