You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Java中使用JSch无密码连接远程机器?解决Auth fail错误

实现JSch无密码SSH连接(密钥对认证)

嘿,你遇到的这个Auth fail问题很常见——要实现不用明文密码连接远程机器,SSH密钥对认证就是标准且更安全的解决方案,我来一步步给你讲清楚怎么操作:

第一步:生成本地SSH密钥对

先在你的本地机器生成一对RSA密钥(默认路径即可,也可以自定义):
打开终端执行命令:

ssh-keygen -t rsa

一路按回车完成生成(如果想给私钥加密码短语增强安全性,可以在提示时输入,后续代码里需要用到这个短语)。执行完后,你会在~/.ssh/目录下得到两个文件:

  • id_rsa:本地私钥文件,要妥善保管,绝对不能泄露
  • id_rsa.pub:公钥文件,需要上传到远程机器

第二步:把公钥部署到远程机器

把本地的id_rsa.pub内容追加到远程机器的~/.ssh/authorized_keys文件中:
可以用便捷命令直接上传(替换成你的远程用户名和主机):

ssh-copy-id your-remote-username@192.168.1.123

如果没有ssh-copy-id命令,也可以手动复制公钥内容,登录远程机器后编辑~/.ssh/authorized_keys,把公钥粘贴进去。

⚠️ 关键权限要求:远程机器的权限必须设置正确,否则SSH服务器会直接拒绝认证:

# 设置.ssh目录权限为700(仅所有者可读写执行)
chmod 700 ~/.ssh
# 设置authorized_keys权限为600(仅所有者可读写)
chmod 600 ~/.ssh/authorized_keys

第三步:修改JSch代码实现密钥认证

现在调整你的Java代码,用私钥完成认证,不再需要硬编码密码:

String host = "192.168.1.123";
String username = "your-remote-username"; // 这里必须明确指定远程机器的用户名!之前的代码没传,默认用本地用户名,大概率不匹配

JSch jsch = new JSch();

// 加载本地私钥:如果私钥在默认路径~/.ssh/id_rsa,这行可以省略,JSch会自动查找
// 如果私钥设置了密码短语,第二个参数传入你的短语字符串即可
jsch.addIdentity("/home/your-local-username/.ssh/id_rsa");

Session session = jsch.getSession(username, host);
Properties config = new Properties();
// 生产环境建议把StrictHostKeyChecking改成"yes"或"ask",避免中间人攻击风险
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);

session.connect();
// 连接成功!接下来可以打开Channel执行命令、传输文件等操作

常见坑点排查

  1. 用户名不匹配:你之前的代码调用jsch.getSession(host),默认会用本地系统的用户名,如果远程机器的用户名和本地不一致,必然会认证失败,一定要明确传入远程用户名。
  2. 私钥路径错误:如果你的私钥不在默认路径,必须用addIdentity指定正确的文件路径。
  3. 权限问题:远程机器的.ssh目录和authorized_keys权限配置错误是最常见的认证失败原因,务必按要求设置权限。
  4. 私钥密码短语:如果生成私钥时设置了密码短语,必须在addIdentity的第二个参数传入,否则会认证失败。

内容的提问来源于stack exchange,提问作者santosh

火山引擎 最新活动