我正在尝试使用apache-commons-vfs API将文件从Windows上传到Linux。我可以使用此实用程序上传文件,但是当程序运行时,它要求凭据输入甚至已经存在于代码中的凭据。如果我们也在凭证中输入空白,则允许上传。
是否可以跳过该凭据提示?
如果SSH私有/公共是唯一的解决方案,那么请分享执行此操作的步骤。
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import org.apache.commons.vfs2.FileObject;
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;
public class SSHUtility {
static Properties props;
public static void main(String[] args) {
SSHUtility SSHUtility = new SSHUtility();
if (args.length < 1) {
System.err.println("Usage: java " + SSHUtility.getClass().getName() + " Properties_file File_To_FTP ");
System.exit(1);
}
String propertiesFile = args[0].trim();
String fileToFTP = args[1].trim();
SSHUtility.startFTP(propertiesFile, fileToFTP);
}
public boolean startFTP(String propertiesFilename, String fileToFTP) {
props = new Properties();
StandardFileSystemManager manager = new StandardFileSystemManager();
try {
// props.load(new FileInputStream("properties/" + propertiesFilename));
props.load(new FileInputStream(propertiesFilename));
String serverAddress = props.getProperty("serverAddress").trim();
String userId = props.getProperty("userId").trim();
String password = props.getProperty("password").trim();
String remoteDirectory = props.getProperty("remoteDirectory").trim();
String localDirectory = props.getProperty("localDirectory").trim();
// check if the file exists
String filepath = localDirectory + fileToFTP;
File file = new File(filepath);
if (!file.exists())
throw new RuntimeException("Error. Local file not found");
// Initializes the file manager
manager.init();
// Setup our SFTP configuration
FileSystemOptions opts = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000);
// Create the SFTP URI using the host name, userid, password, remote path and file name
String sftpUri = "sftp://" + userId + ":" + password + "@" + serverAddress + ":/" + remoteDirectory
+ fileToFTP;
// Create local file object
FileObject localFile = manager.resolveFile(file.getAbsolutePath());
System.out.println("localFile::::" + file.getAbsolutePath());
// Create remote file object
FileObject remoteFile = manager.resolveFile(sftpUri, opts);
// Copy local file to sftp server
remoteFile.copyFrom(localFile, Selectors.SELECT_SELF);
System.out.println("File upload successful");
} catch (Exception ex) {
ex.printStackTrace();
return false;
} finally {
manager.close();
}
return true;
}
}
答案 0 :(得分:0)
将setPreferredAuthentications设置为“publickey,keyboard-interactive,password”可以解决此问题。
// Setup our SFTP configuration
FileSystemOptions opts = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000);
SftpFileSystemConfigBuilder.getInstance().setPreferredAuthentications(opts, "publickey,keyboard-interactive,password");