SFTP通过java编码抛出Exception并说无效的绝对URI

时间:2012-06-25 10:37:49

标签: java sftp

Followed this code

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

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  

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

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

5 个答案:

答案 0 :(得分:3)

解决方案是在调用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可能看起来有点乱,但在调用代码中没有太大的问题。

答案 1 :(得分:1)

在您的pom文件中添加 jsch ,错误将会解决。

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.50</version>
</dependency>

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您可能使用的是您提供的link中的以下代码:

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());

问题是,您未指定端口。让我们假设它是21给您:

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

但是还有另一个问题。

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

import java.net.URLEncoder;

public static String createConnectionString(String hostName, String username, 
                                            String password, String remoteFilePath) {
   try {
        return "sftp://" + encode(username, "UTF-8") + ":" + encode(password, "UTF-8") 
                         + "@" + hostName + "/" + remoteFilePath;
    } catch (UnsupportedEncodingException e) {
        return "sftp://" + username + ":" + password + "@" + hostName + "/" + remoteFilePath;
    }
}

答案 4 :(得分:0)

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