Как я могу получить доступ к FTP-серверу с помощью JSch? - PullRequest
8 голосов
/ 13 сентября 2011

Я установил FileZilla FTP-сервер на свой локальный компьютер с Windows 7.Я также установил FTP-клиент FileZilla на той же машине.Соединение между ними успешно установлено, подтверждая наличие партнерских отношений между сервером и сервером.

Я написал небольшую быструю и грязную программу Jsch для подключения к FTP-серверу FileZilla, а ниже приведена программа:

public class TestJSch {

/** Creates a new instance of TestCommonsNet */
public TestJSch() {
}

/**
 * main - Unit test program
 * 
 * @param args
 *            Command line arguments
 * 
 */
public static void main(String[] args) {
    try {
        String ftpHost = "127.0.0.1";
        int ftpPort = 21;// 14147;
        // int ftpPort = 990;// 14147;
        String ftpUserName = "kedar";
        String ftpPassword = "XXXXXXXXXXX";
        String ftpRemoteDirectory = "C:\\KEDAR\\Java\\FTP_Folder";
        String fileToTransmit = "C:\\KEDAR\\Java\\File_Folder\\Customer.txt";
        String identityfile = "C:\\KEDAR\\Java\\Ftp\\certificate.crt";

        //
        // First Create a JSch session
        //
        JSch.setLogger(new MyLogger());
        System.out.println("Creating session.");

        JSch jsch = new JSch();

        String knownHostsFilename = "C:\\Windows\\System32\\drivers\\etc\\hosts";
        jsch.setKnownHosts(knownHostsFilename);
        jsch.addIdentity(identityfile);
        Session session = null;
        Channel channel = null;
        ChannelSftp c = null;

        //
        // Now connect and SFTP to the SFTP Server
        //
        try {
            // Create a session sending through our username and password
            session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
            System.out.println("Session created.");
            session.setPassword(ftpPassword);
            // Security.addProvider(new com.sun.crypto.provider.SunJCE());

            // b
            // Setup Strict HostKeyChecking to no so we dont get the
            // unknown host key exception
            //
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();
            System.out.println("Session connected.");

            //
            // Open the SFTP channel
            //
            System.out.println("Opening Channel.");
            channel = session.openChannel("sftp");
            channel.connect();
            c = (ChannelSftp) channel;
        } catch (Exception e) {
            System.err.println("Unable to connect to FTP server."
                    + e.toString());
            throw e;
        }

        //
        // Change to the remote directory
        //
        System.out.println("Changing to FTP remote dir: "
                + ftpRemoteDirectory);
        c.cd(ftpRemoteDirectory);

        //
        // Send the file we generated
        //
        try {
            File f = new File(fileToTransmit);
            System.out.println("Storing file as remote filename: "
                    + f.getName());
            c.put(new FileInputStream(f), f.getName());
        } catch (Exception e) {
            System.err
                    .println("Storing remote file failed." + e.toString());
            throw e;
        }   

        //
        // Disconnect from the FTP server
        //
        try {
            c.quit();
        } catch (Exception exc) {
            System.err.println("Unable to disconnect from FTPserver. "
                    + exc.toString());
        }

    } catch (Exception e) {
        System.err.println("Error: " + e.toString());
    }

    System.out.println("Process Complete.");
    System.exit(0);
}

public static class MyLogger implements com.jcraft.jsch.Logger {
    static java.util.Hashtable name = new java.util.Hashtable();
    static {
        name.put(new Integer(DEBUG), "DEBUG: ");
        name.put(new Integer(INFO), "INFO: ");
        name.put(new Integer(WARN), "WARN: ");
        name.put(new Integer(ERROR), "ERROR: ");
        name.put(new Integer(FATAL), "FATAL: ");
    }

    public boolean isEnabled(int level) {
        return true;
    }

    public void log(int level, String message) {
        System.err.print(name.get(new Integer(level)));
        System.err.println(message);
    }
}
}

Я попытался запустить эту программу, и ниже находится журнал FTP:

(000033) 12.09.2011 13:08:53 PM - (не вошел в систему) (127.0.0.1)> Подключено, отправка приветственного сообщения ...
(000033) 12.09.2011 13:08:53 - (не вошел) (127.0.0.1)> 220-FileZilla Server версии 0.9.39 бета
(000033) 12.09.2011 13:08:53 - (не вошел в систему) (127.0.0.1)> 220-написанный Тимом Коссе (Tim.Kosse@gmx.de)
(000033) 12.09.201113:08:53 PM - (не авторизован) (127.0.0.1)> 220 Пожалуйста, посетите http://sourceforge.net/projects/filezilla/
(000033) 12.09.2011 13:08:53 PM - (не авторизован) (127.0.0.1)> SSH-2.0-JSCH-0.1.44
(000033) 12.09.2011 13:08:53 - (не зарегистрирован) (127.0.0.1)> 500 Синтаксическая ошибка, команда не распознана.
(000033) 12.09.2011 13:09:54 PM - (не зарегистрировано)(127.0.0.1)> 421 Время входа в систему превышено.Закрытие управляющего соединения.
(000033) 12.09.2011 13:09:54 PM - (не авторизован) (127.0.0.1)> отключен.

Я не понимаю, почемупрограмма JSch выдает команду SSH-2.0-JSCH-0.1.44, и связь затем отключается.Как мы этого избежать?

Ответы [ 2 ]

19 голосов
/ 13 сентября 2011

JSch не является клиентом FTP. JSch является клиентом SSH (с включенной реализацией SFTP).

Протокол SSH - это протокол, разрешающий безопасные соединения с сервером, длядоступ к оболочке, передача файлов или переадресация портов.Для этого на сервере должен быть SSH-сервер (обычно на порту 22, но это может варьироваться).SFTP - это двоичный протокол передачи файлов, который обычно проходит через SSH и не связан с FTP (кроме как по имени).

Если вы хотите использовать JSch для загрузки / выгрузки файлов, вам необходимо установить и активироватьSSH / SFTP-сервер на вашем компьютере (соответствующий компьютеру, к которому вы хотите получить доступ).

Для FTP вы должны использовать другие библиотеки Java (Apache Commons FTPClient, кажется, известен из вопросов здесь).

Кстати, файл известных хостов для JSch - это файл, в котором перечислены открытые ключи хостов SSH, а не файл, содержащий их IP-адреса (это файл конфигурации Windows, который вы пытаетесь использовать.поставить здесь).

2 голосов
/ 14 июня 2017

Использование FTP-библиотека Apache commons-net .

import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPReply;

public class FTPConnectionCode {

    public static void main(String[] args) {
        String server = "www.website.com";
       // generally ftp port is 21
        int port = 21;
        String user = "ftpusername";
        String pass = "ftppassword";

        FTPClient ftpClient = new FTPClient();

        try {

            ftpClient.connect(server, port);
            showServerReply(ftpClient);

            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                System.out.println("Connect failed");
                return;
            }

            boolean success = ftpClient.login(user, pass);
            showServerReply(ftpClient);

            if (!success) {
                System.out.println("Could not login to the server");
                return;
            }

            // Changes working directory
            success = ftpClient.changeWorkingDirectory("/dir");
            showServerReply(ftpClient);

            if (success) {
                System.out.println("Successfully changed working directory.");
            } else {
                System.out.println("Failed to change working directory. See server's reply.");
            }

            // logs out
            ftpClient.logout();
            ftpClient.disconnect();

        } catch (IOException ex) {
            System.out.println("Oops! Something wrong happened");
            ex.printStackTrace();
        }
    }

    private static void showServerReply(FTPClient ftpClient) {
        String[] replies = ftpClient.getReplyStrings();
        if (replies != null && replies.length > 0) {
            for (String aReply : replies) {
                System.out.println("SERVER: " + aReply);
            }
        }
    }
}
...