JSCH通过密钥文件进行远程访问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSCH通过密钥文件进行远程访问相关的知识,希望对你有一定的参考价值。

需求:WEB app 需要使用JSCH来通过密钥文件的方式进行SFTP/SSH访问远程LINUX机器

实现方式:假设远程机器都含有用户名为hadoop的用户,因为密码因为策略的要求密码会随时间发生变化,所以希望使用密钥的方式进行访问机器,这样不会因为密码的变化而无法访问远程机器。

基本原理:SSH访问,被访问的机器首先需要启动SSHD服务,然后通过SSH-KEYGEN 默认生成RSA的公私密钥对。

而且需要配置无密码访问,即需要把本机的公钥文件放置到.ssh下的authorized_keys文件,而且还要保证文件权限是600.注意,这里默认让生成密钥时需要的PASSPHASE保持一致,可以保持为空

,这样方便在代码里使用。
在JSCH代码段里,通过传递 用户名,IP,PASSPHASE,保存私钥的文件即要建立连接。

同一个机器上同一个用户,使用相同的PASSPHASE也会生成不同的私钥文件,所以需要保存多份私钥文件。

调用时的代码示例如下:

        String hostIp = "192.168.1.175";
        Session session = SSHExecUtil.getInstance().getSession2(hostIp, "hadoop","D:/code/learningJava/src/main/resources/hadoop_rsa");
        ChannelExec channelExec = (ChannelExec)  SSHExecUtil.getInstance().getChannelExec(session);
        String command = "ls -a /";
        String result = SSHExecUtil.getInstance().execCommand(channelExec, command);
        
        System.out.println(result);

 

生成session部分的代码如下:

        JSch jsch = new JSch();
        jsch.addIdentity(filePath,"");
        Session session=jsch.getSession(userName, hostIp, 22);
        UserInfo ui=new CustomUserInfo();
        session.setUserInfo(ui);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();

需要写一段SHELL脚本去完成自动配置无密码访问本地的功能,另外一种实现思路是,所有机器使用相同的一份公私钥文件。即把.ssh下面的内容只在某一台机器上生成一份,然后打包分发到其他机器上即可。

以上是关于JSCH通过密钥文件进行远程访问的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java JSch 进行 SFTP 文件传输

java使用Jsch实现远程操作linux服务器进行文件上传下载,删除和显示目录信息

jsch连接sftp后连接未释放掉问题排查

openssh配置密钥进行远程访问

Java中通过jsch来连接远程服务器执行linux命令

即使服务器的主机密钥存在于 known_hosts 文件中,JSch 连接也会因 UnknownHostKey 而失败