如何在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执行命令、传输文件等操作
常见坑点排查
- 用户名不匹配:你之前的代码调用
jsch.getSession(host),默认会用本地系统的用户名,如果远程机器的用户名和本地不一致,必然会认证失败,一定要明确传入远程用户名。 - 私钥路径错误:如果你的私钥不在默认路径,必须用
addIdentity指定正确的文件路径。 - 权限问题:远程机器的
.ssh目录和authorized_keys权限配置错误是最常见的认证失败原因,务必按要求设置权限。 - 私钥密码短语:如果生成私钥时设置了密码短语,必须在
addIdentity的第二个参数传入,否则会认证失败。
内容的提问来源于stack exchange,提问作者santosh




