14 votes

Pourquoi une connexion SFTP existe-t-elle encore après la fermeture du canal JSCH?

Lorsque le code ci-dessous a fini de s'exécuter, netstat -a|grep sftp montre une connexion SFTP ouverte. Elle apparaît également comme une connexion ouverte dans JProfiler.

channel.isConnected() dans le bloc enfin affiche false. Des idées sur pourquoi la connexion n'est pas fermée car je suis perdu?

public static void clean() {
    com.jcraft.jsch.ChannelSftp channel = null;
    try {
        channel = Helper.openNewTLSftpChannel();
        channel.connect();
        channel.cd(remoteFileDirectory);

        List list = channel.ls("*." + fileType);
        for (ChannelSftp.LsEntry file : list) {
            String fileName = file.getFilename();
            DateTime fileDate = new DateTime(parseDateFromFileName(fileName));

            //si ce fichier est plus ancien que la date de coupure, supprimez-le du partage SFTP
            if (fileDate.compareTo(cleanupCutoffdate) < 0) {
                channel.rm(fileName);
            }
        }
    } catch (Exception exception) {
        exception.printStackTrace();
    } finally {
        if (channel != null) {
            channel.disconnect();
            System.out.println(channel.isConnected());
        }
    }
}

Ajout de openNewTLSftpChannel() ci-dessous :

public static ChannelSftp openNewSftpChannel(String privateKeyFileName, String password, String username, String host, int port)
        throws ConfigurationErrorException {

    JSch jsch = new JSch();
    File sftpPrivateFile = new File(privateKeyFileName);
    Channel channel;
    try {
        if (!sftpPrivateFile.canRead()) {
            throw new ConfigurationErrorException("Erreur d'accès au fichier : " + sftpPrivateFile.getAbsolutePath());
        }
        jsch.addIdentity(sftpPrivateFile.getAbsolutePath(), password);
        Session session = jsch.getSession(username, host, port);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        channel = session.openChannel("sftp");
    } catch (JSchException jschException) {
        throw new ConfigurationErrorException("Erreur d'accès au fichier : " + sftpPrivateFile.getAbsolutePath());
    }
    return (ChannelSftp) channel;
}

27voto

Robert H Points 4145

Si vous regardez les exemples de JSCH pour SFTP, vous verrez comment la session est terminée :

//Configurer la session ici 
...
session.connect();
...

Canal canal = session.openChannel("sftp");
canal.connect();
ChannelSftp sftpChannel = (ChannelSftp) canal;

...exécuter la logique sftp...

//fermer les sessions ici
sftpChannel.exit();
session.disconnect();

Vous remarquerez qu'il y a deux parties lors de la connexion et de la déconnexion ; l'objet Session et l'objet Canal.

Dans mon code, j'utilise l'objet Session pour définir mes informations d'authentification, et l'objet Canal pour exécuter les commandes sftp dont j'ai besoin.

Dans votre cas, vous créez l'objet Session dans votre méthode openNewSftpChannel, mais il n'est jamais fermé, d'où votre session reste active.

Pour plus de contexte, consultez les exemples.

9voto

Damienknight Points 1525

Robert H a raison, vous devez quitter votre canal et déconnecter votre session. Je voulais ajouter que la session existe même lorsque le canal a été fermé. Comme vous créez votre session dans un bloc try à l'intérieur d'une méthode, il semble que vous ayez perdu votre session, mais vous pouvez la récupérer en utilisant 'getSession' sur votre canal sftpChannel.

Vous pouvez modifier votre bloc finally comme suit:

} finally {
    if (channel != null) {
        Session session = channel.getSession();
        channel.disconnect();
        session.disconnect();
        System.out.println(channel.isConnected());
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X