java - 如何在不传递用户名和密码的情况下通过java连接到unix
问题描述
如何在不传递用户名和密码的情况下从 java 连接到远程 unix 主机。
下面的代码是我正在使用的
package testing;
import java.io.InputStream;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class Test {
public static void main(String[] args) {
execute();
}
public static void execute() {
try {
JSch jsch = new JSch();
String user = "xxxx";
String host = "xxxxxx";
int port = 22;
String privateKey = "xxxxxxxxx";
jsch.addIdentity(privateKey);
System.out.println("identity added ");
Session session = jsch.getSession("nudayaku","cloudgw-dev-01" );
System.out.println("session created.");
session.setConfig("PreferredAuthentications", "publickey");
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
System.out.println("session connected.....");
} catch (Exception e) {
System.err.println(e);
}
}
}
请找出以下错误。
堆栈跟踪错误
com.jcraft.jsch.Session.connect(Session.java:519)
com.jcraft.jsch.Session.connect(Session.java:183)
testing.Test.execute(Test.java:39)
testing.Test.main(Test.java:17)
解决方案
根据迄今为止的证据,最可能的原因是(IMO):
- 您使用了错误的主机,并且该主机上不存在该帐户。
- 您为远程帐户使用了错误的用户名
- 您使用的私钥与为远程帐户记录的公钥之一不匹配
- 远程服务器未配置为接受 PublicKey 身份验证。
- 远程帐户的
~/.ssh
目录配置不正确。一个常见的问题是~/.ssh
目录或~/.ssh/authorized_keys
文件太开放。
我认为我们可以消除私钥文件的问题。我认为这会给你一个不同的例外。
如果以上都不是原因,那么您需要在调试级别打开 JSch 日志记录,以更深入地了解正在发生的问题。不幸的是,JSch 默认不使用日志框架,但是在 JSch 示例页面中有一个示例提供了可以借用的代码:
最后,如果客户端日志没有帮助,请查看是否可以(暂时)打开sshd
远程服务器端的调试。(请注意,这sshd
是一个安全/隐私问题。将记录有关所有SSH 连接的敏感信息。)
这不是问题,但是下面的代码看起来有点奇怪:
session.setConfig("PreferredAuthentications", "publickey");
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
你为什么不把最后 3 个语句写成如下?
session.setConfig("StrictHostKeyChecking", "no");
推荐阅读
- docker - 如何使用 docker:dind 图像运行单个命令(任务)容器
- python - 如何有效地识别 numpy 数组中的“类似 HSV-to-neightbours”像素?
- complexity-theory - 具有更简单决策版本的非平凡问题
- java - openGL ES 旋转 AR 对象
- html - 在 Bootstrap 中均匀分布嵌套的行/列?
- php - CSS由于某种原因没有加载
- python - 比较python中不同文件扩展名(pdf和word)的表数据
- flutter - 颤振错误:未为类“对象”定义运算符“[]”?
- javascript - 如何查询cheerio以获取包含选择器标签的html输出
- loops - 找不到我的“输入结束编号(0-16):”提示一直循环的原因。我的开始提示将停止循环,但我的结束不会有任何建议?