En essayant de télécharger le fichier sur notre serveur, je reçois l'exception suivante
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
La partie de la fonction transferFileToReciever du fichier source est
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;
Les mots de passe fonctionnent, car je peux me connecter en utilisant ssh, mais en utilisant JSCh, cela ne fonctionne même pas avec la clé, le nom d'utilisateur et le mot de passe. Utilisation de la clé id_dsa avec Java version "1.6.0_25". Quelle pourrait être l'erreur?
Trouvé une autre question similaire, mais pas la réponse. Merci d'avance.
En traçant la cause première, j'ai finalement trouvé que la clé publique de type dsa n'est pas ajoutée aux clés autorisées sur le serveur distant. Ajouter la même chose a fonctionné pour moi.
Le ssh fonctionnait avec la clé rsa, me faisant regarder en arrière dans mon code.
merci tout le monde.
Si le nom d'utilisateur/mot de passe contient des caractères spéciaux, à l'intérieur de la configuration de chameau, utilisez RAW pour configurer les valeurs comme
RAW(se+re?t&23)
où se+re?t&23
est le mot de passe réel
RAW({abc.ftp.password})
où {abc.ftp.password}
les valeurs proviennent d'un fichier de propriétés de ressort.
En utilisant RAW, j'ai résolu mon problème.
Exemple de cas, lorsque j'obtiens un fichier du serveur distant et l'enregistre sur la machine locale
connecteur de boîtier;
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();
}
}
Trouvé une autre question similaire, mais pas la réponse.
Il aurait été intéressant de savoir où vous avez trouvé cette question.
Autant que je me souvienne et selon com.jcraft.jsch.JSchException: Auth cancel essayez d'ajouter à la méthode .addIdentity()
une phrase secrète. Vous pouvez utiliser ""
au cas où vous auriez généré un fichier clé sans un. Une autre source d'erreur est la chaîne d'empreintes digitales. S'il ne correspond pas, vous obtiendrez également un échec d'authentification (cela dépend du serveur cible).
Et enfin ici mon code source de travail - après avoir pu résoudre les tâches d'administration laides:
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;
}
J'ai également fait face au problème d'échec d'authentification, le problème avec mon code est que j'ai
channelSftp.cd("");
Il l'a changé en
channelSftp.cd(".");
Alors ça marche.
Essayez d'ajouter explicitement la méthode auth comme ci-dessous, car parfois elle est requise:
session.setConfig("PreferredAuthentications", "password");
dans mon cas, j'utilisais la dépendance ci-dessous
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.42</version>
</dependency>
et obtenir la même exception d'échec d'authentification, mais la dépendance mise à jour vers la version ci-dessous et le problème sont résolus.
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>