gpt4 book ai didi

java - 如何将 apache vfs2 用于带有公私钥且没有密码的 sftp

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:13 24 4
gpt4 key购买 nike

目前我正在使用 apache vfs2 从 sftp 下载文件。对于身份验证,我使用用户名和密码。

有没有办法在没有密码的情况下仅使用公钥-私钥来使用 vfs2?

我想我已经使用了这个功能,但是如何使用呢?仅将其设置为"is"?

SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(options, "no");

这是我当前的代码(片段):

private boolean downloadFile(){

StandardFileSystemManager sysManager = new StandardFileSystemManager();

//download der Datei
try {
sysManager.init();

FileObject localFile = sysManager.resolveFile(localFilePath);

FileObject remoteFile = sysManager.resolveFile(createConnectionString(host, user, password, fileName, port),createDefaultOptions());

//Selectors.SELECT_FILES --> A FileSelector that selects only the base file/folder.
localFile.copyFrom(remoteFile, Selectors.SELECT_FILES);


} catch (Exception e) {
logger.error("Downloading file failed: " + e.toString());
return false;
}finally{
sysManager.close();
}
return true;
}

private FileSystemOptions createDefaultOptions() throws FileSystemException{

//create options for sftp
FileSystemOptions options = new FileSystemOptions();
//ssh key
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(options, "no");
//set root directory to user home
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(options, true);
//timeout
SftpFileSystemConfigBuilder.getInstance().setTimeout(options, timeout);

return options;
}

最佳答案

获取您的代码并将其包装到一个可运行的示例中。注意 IdentityInfo 实现。这可以通过更改明显的行来使用带密码的 key 。

$ javac -cp 'jsch-0.1.51.jar;commons-vfs2-2.0.jar' SftpGet.java
$ java -cp 'jsch-0.1.51.jar;commons-vfs2-2.0.jar;commons-logging-1.1.1.jar;.' SftpGet

import java.io.File;

import com.jcraft.jsch.UserInfo;

import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.Selectors;
import org.apache.commons.vfs2.impl.StandardFileSystemManager;
import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder;
import org.apache.commons.vfs2.provider.sftp.IdentityInfo;


public class SftpGet {

public static void main(String[] args) {
downloadFile();
}


private static boolean downloadFile(){

String host = "HOSTNAMEHERE";
String user = "USERNAMEHERE";
String password = "";
String fileName = "/lines.txt";
String localFilePath = "c:/cygwin64/home/woddle/wrote_lines.txt";

// without passphrase
String keyPath = "c:/cygwin64/home/woddle/.ssh/id_dsa_nopass";
String passphrase = null;

// with passphrase
// String keyPath = "c:/cygwin64/home/woddle/.ssh/id_dsa_withpass";
// String passphrase = "super-secrets";

StandardFileSystemManager sysManager = new StandardFileSystemManager();

//download der Datei
try {
sysManager.init();

FileObject localFile = sysManager.resolveFile(localFilePath);

FileObject remoteFile = sysManager.resolveFile(createConnectionString(host, user, password, keyPath, passphrase, fileName), createDefaultOptions(keyPath, passphrase));

//Selectors.SELECT_FILES --> A FileSelector that selects only the base file/folder.
localFile.copyFrom(remoteFile, Selectors.SELECT_FILES);


} catch (Exception e) {
System.out.println("Downloading file failed: " + e.toString());
return false;
}finally{
sysManager.close();
}
return true;
}


public static String createConnectionString(String hostName, String username, String password, String keyPath, String passphrase, String remoteFilePath) {

if (keyPath != null) {
return "sftp://" + username + "@" + hostName + "/" + remoteFilePath;
} else {
return "sftp://" + username + ":" + password + "@" + hostName + "/" + remoteFilePath;
}
}



private static FileSystemOptions createDefaultOptions(final String keyPath, final String passphrase) throws FileSystemException{

//create options for sftp
FileSystemOptions options = new FileSystemOptions();
//ssh key
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(options, "no");
//set root directory to user home
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(options, true);
//timeout
SftpFileSystemConfigBuilder.getInstance().setTimeout(options, 10000);

if (keyPath != null) {
IdentityInfo identityInfo = null;
if(passPhrase!=null){
identityInfo = new IdentityInfo(new File(keyPath), passPhrase.getBytes());
}else{
identityInfo = new IdentityInfo(new File(keyPath));
}
SftpFileSystemConfigBuilder.getInstance().setIdentityInfo(options, identityInfo);
}


return options;
}


}

关于java - 如何将 apache vfs2 用于带有公私钥且没有密码的 sftp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28430315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com