web-dev-qa-db-fra.com

Connexion SFTP via Java demandant une authentification étrange

J'écris donc un petit programme qui doit se connecter à un serveur distant via SFTP, dérouler un fichier, puis traiter le fichier. J'ai rencontré JSch à travers quelques réponses ici et cela semblait parfait pour la tâche. Jusqu'à présent, facile à utiliser et je l'ai fait fonctionner, avec une petite chose que je voudrais corriger. J'utilise le code suivant pour se connecter et tirer le fichier vers le bas:

    JSch jsch = new JSch();
    Session session = null;
    try {
        session = jsch.getSession("username", "127.0.0.1", 22);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword("password");
        session.connect();

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp sftpChannel = (ChannelSftp) channel;
        sftpChannel.cd(REMOTE_FTP_DIR);
        sftpChannel.lcd(INCOMING_DIR);
        sftpChannel.get(TMP_FILE, TMP_FILE);
        sftpChannel.exit();
        session.disconnect();
    } catch (JSchException e) {
        e.printStackTrace();
    } catch (SftpException e) {
        e.printStackTrace();
    }

Donc ça marche et j'obtiens le fichier. J'exécute ce code sur un serveur Linux et lorsque j'exécute le code, JSch me demande mon nom d'utilisateur et mon mot de passe Kerberos. On dirait:

Nom d'utilisateur Kerberos [george]:

Mot de passe Kerberos pour George:

Je viens d'appuyer sur Entrée pour les deux questions, puis le programme semble continuer sans problème. Cependant, j'ai besoin que ce code soit automatisé via une tâche cron et je préfère donc ne pas l'interrompre pour me poser ces deux questions. Y a-t-il quelque chose que je ne fournis pas pour qu'il ne me le demande pas? Quelque chose que je dois faire pour l'empêcher de demander? J'espère que quelqu'un a des idées. Merci.

43
cardician

Je pensais publier une réponse ici, car au cas où quelqu'un d'autre finirait par rencontrer un problème similaire. Il s'avère que je manque un morceau de code qui fait toute la différence. J'avais juste besoin d'ajouter

session.setConfig("PreferredAuthentications", 
                  "publickey,keyboard-interactive,password");

avant

session.connect();

et tout fonctionne parfaitement maintenant.

82
cardician

Bien que la solution dans la réponse auto-acceptée soit correcte, il manque aucune explication.

Le problème est que l'OP a un ensemble d'authentification Kerberos/GSSAPI comme préféré (la valeur par défaut JSch). Pourtant, OP ne semble pas vraiment l'utiliser/le vouloir, car OP prétend ne pas spécifier de nom d'utilisateur ou de mot de passe pour les invites Kerberos.

La solution consiste à supprimer Kerberos/GSSAPI (gssapi-with-mic) dans la liste des méthodes d'authentification préférées:

session.setConfig(
    "PreferredAuthentications", 
    "publickey,keyboard-interactive,password");
11
Martin Prikryl