我用白话一点的文字来讲:

一、机器的免密ssh登录

例如我的电脑是A,我想免密登录linux机器B(172.16.172.19,用户是mppdb),那么首先我需要用命令

  1. ssh-keygen -t rsa -m PEM 在本地生成一个公钥和密钥,如图:

    java 免密登录linux 并执行命令_文件路径 image.png

可以看到生成之后呢,就会告诉你在哪个目录下面,我的是生成在/Users/wesfer/.ssh下面,私钥是 id_rsa 公钥是id_rsa.pub

  1. 切换到我的电脑生成公私密钥的地方,然后使用下面命令,意思呢就是把你的公钥写进到机器B的授权文件里面
cat id_rsa.pub | ssh mppdb@172.16.172.19 'cat >> .ssh/authorized_keys'

3.权限修改,因为目标机器的密钥你想访问总得需要权限吧

chmod 700 /root
chmod 700 /root/.ssh
chmod 644 /root/.ssh/authorized_keys

4.这样就没有问题了,然后如图中最后的圈图所示,我没有输入密码就直接登录了

5.如果还是不行,无效,那么可以从两个方面来找问题a.权限问题 b.打开linux系统的安全日志来找报错信息,命令是:

tail -f /var/log/secure

二、下面放java代码,以及我遇到的问题:

public static void main(String[] args){
String username = "mppdb";//目标机器的用户
String host = "172.16.172.19";//目标机器的ip
int port = 22;//目标机器的端口号
JSch jsch = new JSch();
Session session;
String privateKeyPath = "~/.ssh/id_rsa";//目标机器的密钥地址
try {
jsch.addIdentity(privateKeyPath);
session = jsch.getSession(username, host, port);
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();

String command = "ssh mppdb@172.16.172.19 'df | grep data'";
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
InputStream in = channel.getInputStream();

channel.connect();

String result = "";
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String buf;
while ((buf = reader.readLine()) != null) {
result += new String(buf.getBytes("gbk"), "UTF-8") + " \r\n";
}
if(StringUtils.isNotBlank(result)){
log.info(result.split(" ")[2]);
log.info(result.split(" ")[3]);
}
channel.disconnect();
session.disconnect();
} catch (JSchException e) {
throw new RuntimeException("Failed to create Jsch Session object.", e);
} catch (IOException e) {
e.printStackTrace();
}
}

以上呢我就是用了命令,把服务器的状态给找到

三、下面是遇到的问题:

1.报错java.io.FileNotFoundException: /root/.ssh/id_rsa (没有那个文件或目录)

这个问题有两个思路:a.确实文件路径不对 b.文件路径对,但是用户不对,免密登录是用户对应用户的,比如我在机器a上的用户a做了对机器b上的用户b的免密登录,那么程序在机器a上我用了用户b启动,就会报这个错误,这个问题困扰了我很久才发现,所以一定要用用户a来启动程序。

2.Invalid privatekey 类似于这样的报错,于是就上网一直搜索,终于找到了可以解决我的问题的解决方式,因为之前我是使用ssh-keygen -t rsa生成的钥匙,现在换成使用ssh-keygen -t rsa -m PEM 配置了一遍,问题解决。

答案在这里

http://www.hackerav.com/?post=44814