Apache Commons VFS2 getUid()在连接到SFTP服务器时生成NumberFormatException

Apache Commons VFS2 getUid()在连接到SFTP服务器时生成NumberFormatException,sftp,apache-commons-vfs,Sftp,Apache Commons Vfs,我正在尝试使用apache-commons-vfs2(V2.6.0)下载一个文件 我可以使用WinSCP访问该站点,因此所有凭据都是正确的,但当我运行以下Java程序时,会出现NumberFormatException错误。我只想从这个主机下载文件 import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.FileSystemManager; import org.apache.commons.vfs2.S

我正在尝试使用apache-commons-vfs2(V2.6.0)下载一个文件

我可以使用WinSCP访问该站点,因此所有凭据都是正确的,但当我运行以下Java程序时,会出现NumberFormatException错误。我只想从这个主机下载文件

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)

User directory=C:\work\neon\TestProject
对于输入字符串:“id-u”
java.lang.NumberFormatException:对于输入字符串:“id-u”
位于java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
在java.lang.Integer.parseInt(Integer.java:580)处
在java.lang.Integer.parseInt(Integer.java:615)
位于org.apache.commons.vfs2.provider.sftp.SftpFileSystem.getUId(SftpFileSystem.java:281)
位于org.apache.commons.vfs2.provider.sftp.SftpFileSystem.detectExecDisabled(SftpFileSystem.java:344)
位于org.apache.commons.vfs2.provider.sftp.SftpFileSystem.(SftpFileSystem.java:94)
位于org.apache.commons.vfs2.provider.sftp.SftpFileProvider.doCreateFileSystem(SftpFileProvider.java:93)
位于org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider.getFileSystem(AbstractOriginatingFileProvider.java:93)
位于org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider.findFile(AbstractOriginatingFileProvider.java:72)
位于org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider.findFile(AbstractOriginatingFileProvider.java:56)
位于org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:717)
位于org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:683)
位于org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:638)
位于TestVFS.main(TestVFS.java:18)
我相信sFTP服务器是在Windows服务器环境下运行的CompleteTP服务器

这是一个问题。看起来它将在commons vfs 2.7.0中修复,在我写这篇文章时,它还没有发布

Commons vfs试图通过在远程服务器上运行命令“ID-u”来获取远程SFTP会话所运行的数字用户ID。2.7版本之前的逻辑要求该命令返回一个非零的退出代码,指示它失败,或者输出一个数字并以代码0退出。从您得到的错误判断,您的SFTP服务器输出的是字符串“id-u”,而不是数字

您可以尝试通过运行以下命令以交互方式再现该行为:

ssh user@host 'id -u'
看看你能得到什么样的输出

看来commons vfs 2.7.0(发布时)将正确处理“id-u”不返回数字的情况。它还可以选择首先禁用运行此命令或检测远程UID


同时,您可以考虑从中创建自己的Cason VFS副本。或者,当客户端尝试运行命令“id-u”时,研究如何使SFTP服务器做出不同的响应。

谢谢,@Kenster-I构建了一个V2.7.0快照并禁用了DexecDetection,并对其进行了排序。我没有对SFTP服务器的管理员访问权限,因此无法通过该路径。该服务器现已发布。