我正在尝试使用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:workneonTestProject
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服务器是在Windows server环境下运行的CompleteFTP服务器。
这是Apache Commons VFS中的一个错误。看起来它将在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。
同时,您可以考虑从源代码构建自己的commons-vfs副本。或者,当客户端尝试运行命令"id-u"时,让SFTP服务器做出不同的响应。