我收到此错误,我在程序中所做的唯一更改是我将参数硬编码为
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机器中的文件。
你能帮我解决一下这个错误吗?
答案 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
。