Apache Commons VFS2 getUid () генерирует NumberFormatException при подключении к SFTP-серверу - PullRequest
2 голосов
/ 28 апреля 2020

Я пытаюсь загрузить файл, используя apache -commons-vfs2 (V2.6.0)

Я могу получить доступ к сайту с помощью WinSCP, поэтому все учетные данные верны, но я получаю ошибку NumberFormatException, когда я запустите следующую Java программу. Я только хочу скачивать файлы с этого хоста.

import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.Selectors;
import org.apache.commons.vfs2.VFS;

public class TestVFS {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            FileSystemManager manager = VFS.getManager();

            System.out.println("User directory = " + System.getProperty("user.dir"));
            FileObject local = manager.resolveFile(
                    System.getProperty("user.dir") + "/" + "vfsFile.txt");
            FileObject remote = manager.resolveFile(
                    "sftp://" + "user" + ":" + "pass" + "@" + "host" + "/" + "file");

            local.copyFrom(remote, Selectors.SELECT_SELF);

            local.close();
            remote.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}

Создается следующее исключение

User directory = C:\work\neon\TestProject
For input string: "id -u"
java.lang.NumberFormatException: For input string: "id -u"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at org.apache.commons.vfs2.provider.sftp.SftpFileSystem.getUId(SftpFileSystem.java:281)
    at org.apache.commons.vfs2.provider.sftp.SftpFileSystem.detectExecDisabled(SftpFileSystem.java:344)
    at org.apache.commons.vfs2.provider.sftp.SftpFileSystem.<init>(SftpFileSystem.java:94)
    at org.apache.commons.vfs2.provider.sftp.SftpFileProvider.doCreateFileSystem(SftpFileProvider.java:93)
    at org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider.getFileSystem(AbstractOriginatingFileProvider.java:93)
    at org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider.findFile(AbstractOriginatingFileProvider.java:72)
    at org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider.findFile(AbstractOriginatingFileProvider.java:56)
    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:717)
    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:683)
    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:638)
    at TestVFS.main(TestVFS.java:18)

Сервер sFTP - это сервер CompleteFTP, работающий в среде Windows Сервер, на мой взгляд.

1 Ответ

0 голосов
/ 28 апреля 2020

Это ошибка в Apache Commons VFS . Похоже, что это будет исправлено в commons-vfs 2.7.0, который еще не был выпущен, когда я пишу это.

Commons-vfs пытается получить числовой идентификатор пользователя c, который удаленный SFTP сеанс запущен, запустив команду "id -u" на удаленном сервере. До 2.7 logi c ожидает, что эта команда либо вернет ненулевой код выхода, указывающий на сбой, либо выведет число и завершит работу с кодом 0. Судя по полученной ошибке, ваш SFTP-сервер выводит строка «id -u» вместо числа.

Вы можете попробовать воспроизвести поведение в интерактивном режиме, набрав:

ssh user@host 'id -u'

и посмотреть, какой вывод вы можете получить.

Похоже, что commons-vfs 2.7.0 (после его выпуска) будет корректно обрабатывать случай, когда id -u не возвращает число. Он также будет иметь возможность отключить выполнение этой команды или обнаружение удаленного UID в первую очередь.

Тем временем вы можете рассмотреть возможность создания своей собственной копии commons-vfs из source, Или посмотрите, как SFTP-сервер реагирует по-другому, когда клиент пытается выполнить команду "id -u".

...