Статус выхода JSch ChannelSftp всегда-1

Я пользуюсь библиотекой JSch, чтобы развивать клиента SFTP.

Проблема, оба , получают и , помещенный , статус методов-1.

Вот мой код:

class SftpClient {
    private static final Logger LOG = Logger.getLogger(SftpClient.class);

    /** Connection port number */
    public static final int PORT = 22;

    /** SECURED protocol name */
    private static final String PROTOCOL = "sftp";

    /** Connection time out in milliseconds */
    public static final int TIME_OUT = 5000;

    /** This class serves as a central configuration point, and as a factory for Session objects configured with these settings */
    private JSch _client;
    /** A session represents a connection to a SSH server */
    private Session _session;
    /** Channel connected to a SECURED server (as a subsystem of the SSH server) */
    private ChannelSftp _channelSftp;

    /**
     * Value returned by the last executed command.
     */
    private int _exitValue;

    /**
     * Computer contains the url, the login and the password to connect.
     */
    private Computer _computer;

    /**
     * Initialize a SECURED client
     * @param target - Machine we want to connect to
     */
    public SftpClient(Computer target) {
        _client = new JSch();
        _computer = target;
    }

    protected void connect() throws Exception {
        try {
            if (_client == null) {
                _client = new JSch();
            }
            if (_session == null) {
                _session = _client.getSession(_computer.getLogin(), _computer.getUrl(), PORT);
                Properties props = new Properties();
                props.put("StrictHostKeyChecking", "no");
                props.put("compression.s2c", "zlib,none");
                props.put("compression.c2s", "zlib,none");
                _session.setConfig(props);
                _session.setPassword(_computer.getPassword());
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Connecting to "+_computer.getUrl()+" with login "+_computer.getLogin()+"...");
                }
            }
            if (!_session.isConnected()) {
                _session.connect(TIME_OUT);
            }
           //disconnect previous channel if it has not been killed properly
            if (_channelSftp != null && _channelSftp.isConnected()) {
                _channelSftp.disconnect();
            }
            _channelSftp = (ChannelSftp) _session.openChannel(PROTOCOL);
            _channelSftp.connect();
            if (LOG.isInfoEnabled()) {
                LOG.info("Connected to "+_computer.getUrl()+" with login "+_computer.getLogin());
            }
        } catch(JSchException e) {
            LOG.error("Auth failed", e);
            throw e;
        }
    }

    protected void connect(String path) throws Exception {
        connect();
        if (_channelSftp != null && _channelSftp.isConnected()) {
            _channelSftp.cd(path);
        }
    }

    public boolean get(final String remoteDirectory, final String remoteFile, final String localDirectory) throws Exception {
        boolean res = false;
        if (LOG.isInfoEnabled()) {
            LOG.info("Download file "+remoteDirectory+"/"+remoteFile+" from "+_computer+" in "+localDirectory);
        }
        if (remoteDirectory != null && remoteFile != null && !remoteFile.isEmpty() && localDirectory != null) {
            try {
               //connect to the server and change directory
                connect(remoteDirectory);
               //change local directory
                _channelSftp.lcd(localDirectory);
               //download the file, keeping the same name
                _channelSftp.get(remoteFile, remoteFile);
               //update exit value
                _exitValue = _channelSftp.getExitStatus();

                if (_exitValue == 0) {
                    res = true;
                }
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Exit status is: "+_exitValue);
                }
            } catch(SftpException e){
                LOG.error("Auth failed", e);
                throw e;
            } finally {
                if (_channelSftp != null && _channelSftp.isConnected()) {
                    _channelSftp.disconnect();
                    _channelSftp.exit();
                }
            }
        } else {
            LOG.warn("Check remoteDirectory ('"+remoteDirectory+"') or remoteFile ('"+remoteFile+"') or localDirectory ('"+localDirectory+"').");
        }
        return res;
    }

    public void put(final File localFile, final String destPath) throws Exception {
        if (LOG.isInfoEnabled()) {
            LOG.info("Send file "+localFile+" to "+_computer+" in "+destPath);
        }
        if (localFile == null) {
            _exitValue = -1;
            LOG.error("The given local file is null. Aborting tranfer.");
            return;
        }
        if (!localFile.exists()) {
            _exitValue = -1;
            LOG.error("The given local file '"+localFile+"' does not exist. Aborting tranfer.");
            return;
        }
        final InputStream input = new FileInputStream(localFile);
        if (input == null || input.available() <= 0) {
            _exitValue = -1;
            LOG.error("Cannot read file "+localFile);
            return;
        }
        try {
            connect(destPath);
            _channelSftp.put(input, localFile.getName());
            _exitValue = _channelSftp.getExitStatus();
            if (LOG.isDebugEnabled()) {
                LOG.debug("Exit status is: "+_exitValue);
            }
        } catch(SftpException e){
            LOG.error("Auth failed", e);
            throw e;
        } finally {
            if (_channelSftp != null && _channelSftp.isConnected()) {
                _channelSftp.disconnect();
                _channelSftp.exit();
            }
            IOUtils.closeQuietly(input);
        }
    }

    public void disconnect() {
        if (_channelSftp != null && _channelSftp.isConnected()) {
            _channelSftp.disconnect();
            _channelSftp.exit();
        }
        if (_session != null && _session.isConnected()) {
            _session.disconnect();
            if (LOG.isInfoEnabled()) {
                LOG.info("SECURED FTP disconnected");
            }
        }
    }
}

Никакое исключение не брошено.

Между прочим, файлы, которые я хочу загрузить и загрузить, являются файлами смолы. У Jsch есть режим двоичного счета FTP?

Файлы хорошо передаются. Я могу использовать их правильно, но я волнуюсь по поводу статуса выхода.

Я взглянул к API Jsch и это говорит:

статус выхода только доступен для определенных типов каналов, и только после того, как канал был закрыт (более точно, непосредственно перед тем, как канал закрывается).

Как я могу знать, доступен ли статус выхода для ChannelSftp ?

2
nl ja de

1 ответы

Смотря на исходный код, это смотрит, ExitStatus не осуществляется для SFTP

channel.setExitStatus(reason_code);

осуществляется для только ниже двух случаев в классе Сессии

case SSH_MSG_CHANNEL_OPEN_FAILURE:
case SSH_MSG_CHANNEL_REQUEST:

и оба, которыми случаи не вызывают по крайней мере для успешных сценариев, которые я проверил.

1
добавлено
Таким образом, нет никакого способа получить код ответа от сервера? Как знать, имел ли запрос успех?
добавлено автор Maxbester, источник
Хорошо, таким образом, единственный путь состоит в том, чтобы использовать checkAck() метод как в примере JSch... Спасибо так или иначе.
добавлено автор Maxbester, источник
добавлено автор Manish Singh, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async