1

遵循此代码

我收到此错误,我在程序中所做的唯一更改是将参数硬编码为

String  hostName = "122.183.217.133" ; 
String username  = "root";
String password = "something";
String  localFilePath = "C://Sample.jpg";
String  remoteFilePath = "/var/www/html/intranetupload/uploads/Sample.jpg";

Jun 25, 2012 2:52:18 PM org.apache.commons.vfs2.VfsLog info
INFO: Using "C:\DOCUME~1\MEENAK~1.DCK\LOCALS~1\Temp\vfs_cache" as temporary files store.
Exception in thread "main" java.lang.RuntimeException: org.apache.commons.vfs2.FileSystemException: Invalid absolute URI "sftp://root:***@122.183.217.133:22/var/www/html/intranetupload/uploads/Sample1.jpg".
    at sftp.sample.Main.delete(Main.java:120)
    at sftp.sample.Main.main(Main.java:36)
Caused by: org.apache.commons.vfs2.FileSystemException: Invalid absolute URI "sftp://root:***@122.183.217.133:22/var/www/html/intranetupload/uploads/Sample1.jpg".
    at org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider.findFile(AbstractOriginatingFileProvider.java:61)
    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:693)
    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:621)
    at sftp.sample.Main.delete(Main.java:111)
    ... 1 more
Caused by: org.apache.commons.vfs2.FileSystemException: Expecting / to follow the hostname in URI "sftp://root:***@122.183.217.133:22/var/www/html/intranetupload/uploads/Sample1.jpg".
    at org.apache.commons.vfs2.provider.HostFileNameParser.extractToPath(HostFileNameParser.java:155)
    at org.apache.commons.vfs2.provider.URLFileNameParser.parseUri(URLFileNameParser.java:50)
    at org.apache.commons.vfs2.provider.AbstractFileProvider.parseUri(AbstractFileProvider.java:188)
    at org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider.findFile(AbstractOriginatingFileProvider.java:57)
    ... 4 more  

我没有服务器的域名。我所拥有的只是一台已知 IP / 用户名和密码的 ubuntu 机器。我的工作需要删除远程 Ubuntu 机器上的文件。

你能帮我解决这个错误吗?

4

5 回答 5

4

解决方法是在调用resolveFile()之前对用户名和密码进行Url编码;

因此,如果您需要调用以下内容:

manager.resolveFile("sftp://sftpuser@Location:Test!@#$%^&*()[]:;@US456564/home57556");

其中用户名是“sftpuser@Location”,密码是“Test!@#$%^&*[]:;:

您只对用户名和密码进行编码,然后将其称为:

manager.resolveFile("sftp://sftpuser%40Location:Test!%40%23%24%25%5E%26*%5B%5D%3A%3B@US456564/home57556");

它可能看起来像 Sting 有点乱,但在调用代码中没有太大问题。

于 2014-03-14T08:23:28.943 回答
3

通过在您的 pom 文件中添加jsch,错误将得到解决。

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.50</version>
</dependency>
于 2016-06-02T03:13:23.347 回答
1

您可能正在使用您提供的链接中的以下代码:

public static String createConnectionString(String hostName,
        String username, String password, String remoteFilePath) {
    // result: "sftp://user:123456@domainname.com/resume.pdf
    return "sftp://" + username + ":" + password + "@" + hostName + "/" + remoteFilePath;
}
FileObject remoteFile = manager.resolveFile(
        createConnectionString(
            "122.183.217.133", "root", "something", "/path/to/file")
        , createDefaultOptions());

问题是,您没有指定端口。让我们假设它22适合您:

createConnectionString("122.183.217.133:22", "root", "something", "/path/to/file")

不过还有另一个问题。

如果您的用户名或密码包含一些不寻常的字符,例如!@#$%^&*():或其他,您需要对其进行 URLEncode。
请改用此方法createConnectionString

import java.net.URLEncoder;

public static String createConnectionString(String hostName, String username, 
                                            String password, String remoteFilePath) {
   try {
        return "sftp://" + URLEncoder.encode(username, "UTF-8") + ":" + URLEncoder.encode(password, "UTF-8") 
                         + "@" + hostName + "/" + remoteFilePath;
    } catch (UnsupportedEncodingException e) {
        return "sftp://" + username + ":" + password + "@" + hostName + "/" + remoteFilePath;
    }
}
于 2019-06-25T13:03:54.847 回答
0

您缺少对 pom 的依赖项。应该足够了,包括:sshtools、jsch 和 commons-net。

对不起,我不能确定,但​​这是一个依赖问题。

于 2012-08-06T13:53:58.647 回答
0

jsch-0.1.46.jar在 lib 文件中添加。

于 2020-08-13T14:17:15.877 回答