在尝试将文件上传到我们的服务器时,我收到以下异常
com.jcraft.jsch.JSchException: Auth fail
at com.jcraft.jsch.Session.connect(Session.java:464)
at com.jcraft.jsch.Session.connect(Session.java:158)
at FtpService.transferFileToReciever(FtpService.java:80)
at FtpService.transferFileToReciever(FtpService.java:54)
at FtpService.transferFileToRecievers(FtpService.java:44)
at FtpService.transferSingeFile(FtpService.java:241)
at FtpService.main(FtpService.java:26)
Auth fail
源文件中的函数transferFileToReciever的部分是
JSch jsch = new JSch();
jsch.addIdentity("/root/.ssh/id_dsa");
Session session = jsch.getSession(username, host, 22);
session.setUserInfo(serverinfo);
session.connect(); //geting exception here
boolean ptimestamp = true;
密码有效,因为我可以使用 ssh 登录,但使用 JSCh 即使提供密钥、用户名和密码也不起作用。 使用 java 版本“1.6.0_25”的 id_dsa 密钥。 可能是什么错误?
找到其他类似问题,但没有答案。
追根溯源,最终发现dsa类型的公钥没有添加到远程服务器上的授权密钥中。添加同样的内容对我有用。
ssh 正在使用 rsa 密钥,让我回顾我的代码。
谢谢大家。
尝试显式添加 auth 方法,如下所示,因为有时需要:
session.setConfig("PreferredAuthentications", "password");
我也遇到了身份验证失败问题,我的代码的问题是我有
channelSftp.cd("");
改成了
channelSftp.cd(".");
然后就可以了。
如果用户名/密码包含任何特殊字符,则在骆驼配置中使用 RAW 来配置值,例如
RAW(se+re?t&23)
其中 se+re?t&23
是实际密码RAW({abc.ftp.password})
,其中 {abc.ftp.password}
值来自 spring 属性文件。通过使用RAW,解决了我的问题。
示例案例,当我从远程服务器获取文件并将其保存在本地计算机中时
封装连接器;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
public class Main {
public static void main(String[] args) throws JSchException, SftpException, IOException {
// TODO Auto-generated method stub
String username = "XXXXXX";
String host = "XXXXXX";
String passwd = "XXXXXX";
JSch conn = new JSch();
Session session = null;
session = conn.getSession(username, host, 22);
session.setPassword(passwd);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
ChannelSftp channel = null;
channel = (ChannelSftp)session.openChannel("sftp");
channel.connect();
channel.cd("/tmp/qtmp");
InputStream in = channel.get("testScp");
String lf = "OBJECT_FILE";
FileOutputStream tergetFile = new FileOutputStream(lf);
int c;
while ( (c= in.read()) != -1 ) {
tergetFile.write(c);
}
in.close();
tergetFile.close();
channel.disconnect();
session.disconnect();
}
}
找到其他类似问题,但没有答案。
知道您在哪里找到这个问题会很有趣。
据我所知,根据 com.jcraft.jsch.JSchException:身份验证取消 尝试向方法
.addIdentity()
添加密码。如果您生成的密钥文件没有密钥文件,则可以使用 ""
。
另一个错误来源是指纹字符串。如果不匹配,您也会遇到身份验证失败(取决于目标服务器)。
最后这里是我的工作源代码 - 在我解决了丑陋的管理任务之后:
public void connect(String host, int port,
String user, String pwd,
String privateKey, String fingerPrint,
String passPhrase
) throws JSchException{
JSch jsch = new JSch();
String absoluteFilePathPrivatekey = "./";
File tmpFileObject = new File(privateKey);
if (tmpFileObject.exists() && tmpFileObject.isFile())
{
absoluteFilePathPrivatekey = tmpFileObject.getAbsolutePath();
}
jsch.addIdentity(absoluteFilePathPrivatekey, passPhrase);
session = jsch.getSession(user, host, port);
//Password and fingerprint will be given via UserInfo interface.
UserInfo ui = new UserInfoImpl(pwd, fingerPrint);
session.setUserInfo(ui);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
c = (ChannelSftp) channel;
}
我们同时使用密码+公钥并收到此错误。我们的问题是我们的公钥使用 OpenSSH,而 Jsch 不支持 OpenSSH,因此必须使用 Jsch 的分叉和改进版本:https://github.com/mwiede/jsch。
在我的例子中,我使用了以下依赖项
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.42</version>
</dependency>
并获得相同的身份验证失败异常,但更新了对以下版本的依赖关系,问题得到解决。
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
我在使用maven插件时遇到了这个问题
git-commit-id-plugin
。我能够推送到本地 git 项目的远程,但是
该插件在运行时出现此错误mvn compile
。看来该插件需要使用 https
协议指定的当前 git 项目的远程。相反,我拥有的是:
$ git remote -v
origin [email protected]:johnbet/myprojectname.git (fetch)
origin [email protected]:johnbet/myprojectname.git (push)
我解决了设置远程 URL 的问题
$ git remote set-url origin https://github.com/johnbet/myprojectname.git
使得上一个命令返回:
$ git remote -v
origin https://github.com/johnbet/myprojectname.git (fetch)
origin https://github.com/johnbet/myprojectname.git (push)
我发现这一点是因为我注意到我的项目最初的远程(我从另一个 GitHub 存储库克隆它)正在使用
https
协议,而我之后设置的协议则不是。
请参阅有关更改远程存储库 url 的官方文档此处。
最近,这个问题的一个新变体出现了。默认情况下,某些 Linux 机器(例如 Amazon Linux 2023)不支持旧版 ssh-rsa。 SSH 客户端必须支持 rsa-sha2-256 或 rsa-sha2-512 - 这对于 jcsh 来说可能是不可能的。
在这种情况下,必须在 Linux 服务器中重新启用 ssh-rsa 支持。在 AL2023 中,这可以通过激活 LEGACY 系统加密策略来完成 - 如下所示
sudo dnf install crypto-policies-scripts
sudo update-crypto-policies --set LEGACY
# Then reboot the server