Gần đây, một khách hàng của chúng tôi đã chuyển một số tệp quan trọng bất ngờ mà chúng tôi thu thập từ máy chủ ftp sang sftp. Ban đầu tôi đã được ấn tượng rằng nó sẽ được đơn giản để viết hoặc tìm thấy một tiện ích java có thể xử lý sftp, điều này chắc chắn đã không được chứng minh là trường hợp. Điều gì cũng đã phức tạp vấn đề này là chúng tôi đang cố gắng kết nối với máy chủ sftp từ một nền tảng cửa sổ (do đó, định nghĩa của nơi SSH_HOME là trên máy khách sẽ rất bối rối).Ví dụ đáng tin cậy về cách sử dụng SFTP bằng cách sử dụng xác thực khóa riêng tư công khai với Java
Tôi đã sử dụng thư viện apache-commons-vfs và đã quản lý để nhận được giải pháp đáng tin cậy cho hoạt động xác thực tên người dùng/mật khẩu, nhưng không có gì có thể xử lý xác thực khóa công khai/riêng tư một cách đáng tin cậy.
Ví dụ sau đây hoạt động để xác thực tên người dùng/mật khẩu, nhưng tôi muốn điều chỉnh nó để xác thực khóa cá nhân/khóa công khai.
public static void sftpGetFile(String server, String userName,String password,
String remoteDir, String localDir, String fileNameRegex)
{
File localDirFile = new File(localDir);
FileSystemManager fsManager = null;
if (!localDirFile.exists()) {
localDirFile.mkdirs();
}
try {
fsManager = VFS.getManager();
} catch (FileSystemException ex) {
LOGGER.error("Failed to get fsManager from VFS",ex);
throw new RuntimeException("Failed to get fsManager from VFS", ex);
}
UserAuthenticator auth = new StaticUserAuthenticator(null, userName,password);
FileSystemOptions opts = new FileSystemOptions();
try {
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts,
auth);
} catch (FileSystemException ex) {
LOGGER.error("setUserAuthenticator failed", ex);
throw new RuntimeException("setUserAuthenticator failed", ex);
}
Pattern filePattern = Pattern.compile(fileNameRegex);
String startPath = "sftp://" + server + remoteDir;
FileObject[] children;
// Set starting path on remote SFTP server.
FileObject sftpFile;
try {
sftpFile = fsManager.resolveFile(startPath, opts);
LOGGER.info("SFTP connection successfully established to " +
startPath);
} catch (FileSystemException ex) {
LOGGER.error("SFTP error parsing path " +
remoteDir,
ex);
throw new RuntimeException("SFTP error parsing path " +
remoteDir,
ex);
}
// Get a directory listing
try {
children = sftpFile.getChildren();
} catch (FileSystemException ex) {
throw new RuntimeException("Error collecting directory listing of " +
startPath, ex);
}
search:
for (FileObject f : children) {
try {
String relativePath =
File.separatorChar + f.getName().getBaseName();
if (f.getType() == FileType.FILE) {
System.out.println("Examining remote file " + f.getName());
if (!filePattern.matcher(f.getName().getPath()).matches()) {
LOGGER.info(" Filename does not match, skipping file ." +
relativePath);
continue search;
}
String localUrl = "file://" + localDir + relativePath;
String standardPath = localDir + relativePath;
System.out.println(" Standard local path is " + standardPath);
LocalFile localFile =
(LocalFile) fsManager.resolveFile(localUrl);
System.out.println(" Resolved local file name: " +
localFile.getName());
if (!localFile.getParent().exists()) {
localFile.getParent().createFolder();
}
System.out.println(" ### Retrieving file ###");
localFile.copyFrom(f,
new AllFileSelector());
} else {
System.out.println("Ignoring non-file " + f.getName());
}
} catch (FileSystemException ex) {
throw new RuntimeException("Error getting file type for " +
f.getName(), ex);
}
}
FileSystem fs = null;
if (children.length > 0) {
fs = children[0].getFileSystem(); // This works even if the src is closed.
fsManager.closeFileSystem(fs);
}
}
Tôi đã có chìa khóa riêng tư của tôi được lưu trữ tại một địa điểm nổi tiếng và khóa công khai của tôi đã được distrubuted đến máy chủ (chúng tôi đã thử nghiệm mà các phím này hoạt động thành công khi kết nối sử dụng các công cụ khác)
Tôi có chơi xung quanh với cách thêm dòng sau
SftpFileSystemConfigBuilder.getInstance().setIdentities(this.opts, new File[]{new File("c:/Users/bobtbuilder/.ssh/id_dsa.ppk")});
này thành công sẽ tải private key vào toàn bộ khuôn khổ nhưng không bao giờ sau đó nó sử dụng rằng chìa khóa để xác thực hơn nữa.
Bất kỳ trợ giúp hoặc chỉ đường nào được đón nồng nhiệt nhất
Isnt 'ppk' một điều putty? Bạn không nên sử dụng 'pem'? – prodigitalson
Có thể, nhưng không phải là máy chủ/khách hàng sftp bất khả tri về cách tạo khóa. Tôi nghĩ điều quan trọng là họ chỉ tuân theo chuẩn mở-ssh? – grumblebee