আমি জাভা ব্যবহার করে এসএফটিপি (এফটিপিএসের বিপরীতে) ব্যবহার করে একটি সার্ভার থেকে একটি ফাইল পুনরুদ্ধার করার চেষ্টা করছি। কিভাবে আমি এটি করতে পারব?
আমি জাভা ব্যবহার করে এসএফটিপি (এফটিপিএসের বিপরীতে) ব্যবহার করে একটি সার্ভার থেকে একটি ফাইল পুনরুদ্ধার করার চেষ্টা করছি। কিভাবে আমি এটি করতে পারব?
উত্তর:
আরেকটি বিকল্প হ'ল জেএসএইচ লাইব্রেরির দিকে তাকানো বিবেচনা করা । জেএসসি বেশ কয়েকটি বৃহত ওপেন সোর্স প্রকল্পগুলির জন্য অন্যান্য গ্রাহকদের মধ্যে এক্লিপস, এন্টি এবং অ্যাপাচি কমন্স এইচটিপিপ্লিনেন্ট সহ পছন্দসই গ্রন্থাগার বলে মনে হচ্ছে।
এটি ব্যবহারকারীর / পাস এবং শংসাপত্র ভিত্তিক লগইনগুলি উভয় সমর্থন করে, পাশাপাশি অন্যান্য মুখরোচক এসএসএইচ 2 বৈশিষ্ট্যগুলির পুরো হোস্ট।
এখানে একটি সহজ রিমোট ফাইল এসএফটিপি থেকে পুনরুদ্ধার করা আছে। পাঠকের জন্য অনুশীলন হিসাবে ত্রুটি পরিচালনা করা বাকি রয়েছে :-)
JSch jsch = new JSch();
String knownHostsFilename = "/home/username/.ssh/known_hosts";
jsch.setKnownHosts( knownHostsFilename );
Session session = jsch.getSession( "remote-username", "remote-host" );
{
// "interactive" version
// can selectively update specified known_hosts file
// need to implement UserInfo interface
// MyUserInfo is a swing implementation provided in
// examples/Sftp.java in the JSch dist
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
// OR non-interactive version. Relies in host key being in known-hosts file
session.setPassword( "remote-password" );
}
session.connect();
Channel channel = session.openChannel( "sftp" );
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
sftpChannel.get("remote-file", "local-file" );
// OR
InputStream in = sftpChannel.get( "remote-file" );
// process inputstream as needed
sftpChannel.exit();
session.disconnect();
এখানে এসএস কী পরীক্ষার বিষয়ে চিন্তা না করে জেএসচ ব্যবহার করে একটি উদাহরণের সম্পূর্ণ উত্স কোড is
import com.jcraft.jsch.*;
public class TestJSch {
public static void main(String args[]) {
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("username", "127.0.0.1", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("password");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
sftpChannel.get("remotefile.txt", "localfile.txt");
sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
}
}
finally
চ্যানেলটি ক্লিন-আপ কোড অন্তর্ভুক্ত করতে একটি ব্লক ব্যবহার করা উচিত, এটি সর্বদা চালিত হয় তা নিশ্চিত করার জন্য।
com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 2048 (inclusive)
নীচে অ্যাপাচি কমন ভিএফএস ব্যবহার করে একটি উদাহরণ দেওয়া হল:
FileSystemOptions fsOptions = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fsOptions, "no");
FileSystemManager fsManager = VFS.getManager();
String uri = "sftp://user:password@host:port/absolute-path";
FileObject fo = fsManager.resolveFile(uri, fsOptions);
এই সমাধানটিই আমি http://sourceforge.net/projects/sshtools/ নিয়ে এসেছি (স্পষ্টতার জন্য বাদ দেওয়া বেশিরভাগ ত্রুটি হ্যান্ডলিং)। এটি আমার ব্লগের একটি অংশ
SshClient ssh = new SshClient();
ssh.connect(host, port);
//Authenticate
PasswordAuthenticationClient passwordAuthenticationClient = new PasswordAuthenticationClient();
passwordAuthenticationClient.setUsername(userName);
passwordAuthenticationClient.setPassword(password);
int result = ssh.authenticate(passwordAuthenticationClient);
if(result != AuthenticationProtocolState.COMPLETE){
throw new SFTPException("Login to " + host + ":" + port + " " + userName + "/" + password + " failed");
}
//Open the SFTP channel
SftpClient client = ssh.openSftpClient();
//Send the file
client.put(filePath);
//disconnect
client.quit();
ssh.disconnect();
জেএসচের শীর্ষে একটি দুর্দান্ত বিমূর্ততা হ'ল অ্যাপাচি কমন্স-ভিএফএস যা একটি ভার্চুয়াল ফাইল সিস্টেম API দেয় যা এসএফটিপি ফাইলগুলিকে অ্যাক্সেস এবং লেখাকে প্রায় স্বচ্ছ করে তোলে। আমাদের জন্য ভাল কাজ করেছে।
এসএফটিপি: কমন্স ভিএফএস, এসএসএইচজে এবং জেএসএচের 3 টি পরিপক্ক জাভা গ্রন্থাগারের একটি দুর্দান্ত তুলনা রয়েছে
সংক্ষিপ্তসার হিসাবে এসএসএইচজে সবচেয়ে স্পষ্টতম এপিআই রয়েছে এবং আপনার যদি কমন্স ভিএফএস দ্বারা সরবরাহিত অন্যান্য স্টোর সমর্থন প্রয়োজন না হয় তবে এগুলির মধ্যে সেরা best
এখানে থেকে SSHJ উদাহরণ সম্পাদিত হয় GitHub :
final SSHClient ssh = new SSHClient();
ssh.loadKnownHosts(); // or, to skip host verification: ssh.addHostKeyVerifier(new PromiscuousVerifier())
ssh.connect("localhost");
try {
ssh.authPassword("user", "password"); // or ssh.authPublickey(System.getProperty("user.name"))
final SFTPClient sftp = ssh.newSFTPClient();
try {
sftp.get("test_file", "/tmp/test.tmp");
} finally {
sftp.close();
}
} finally {
ssh.disconnect();
}
অ্যাপাচি কমন্স এসএফটিপি লাইব্রেরি
সমস্ত উদাহরণের জন্য সাধারণ জাভা বৈশিষ্ট্য ফাইল
serverAddress = 111.222.333.444
আইডি = myUserId
পাসওয়ার্ড = myPassword
remoteDirectory = পণ্য /
localDirectory = আমদানি /
এসএফটিপি ব্যবহার করে দূরবর্তী সার্ভারে ফাইল আপলোড করুন
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 SendMyFiles {
static Properties props;
public static void main(String[] args) {
SendMyFiles sendMyFiles = new SendMyFiles();
if (args.length < 1)
{
System.err.println("Usage: java " + sendMyFiles.getClass().getName()+
" Properties_file File_To_FTP ");
System.exit(1);
}
String propertiesFile = args[0].trim();
String fileToFTP = args[1].trim();
sendMyFiles.startFTP(propertiesFile, fileToFTP);
}
public boolean startFTP(String propertiesFilename, String fileToFTP){
props = new Properties();
StandardFileSystemManager manager = new StandardFileSystemManager();
try {
props.load(new FileInputStream("properties/" + 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());
// 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;
}
}
রিমোট সার্ভার থেকে এসএফটিপি ব্যবহার করে ফাইল ডাউনলোড করুন
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 GetMyFiles {
static Properties props;
public static void main(String[] args) {
GetMyFiles getMyFiles = new GetMyFiles();
if (args.length < 1)
{
System.err.println("Usage: java " + getMyFiles.getClass().getName()+
" Properties_filename File_To_Download ");
System.exit(1);
}
String propertiesFilename = args[0].trim();
String fileToDownload = args[1].trim();
getMyFiles.startFTP(propertiesFilename, fileToDownload);
}
public boolean startFTP(String propertiesFilename, String fileToDownload){
props = new Properties();
StandardFileSystemManager manager = new StandardFileSystemManager();
try {
props.load(new FileInputStream("properties/" + 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();
//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 + fileToDownload;
// Create local file object
String filepath = localDirectory + fileToDownload;
File file = new File(filepath);
FileObject localFile = manager.resolveFile(file.getAbsolutePath());
// Create remote file object
FileObject remoteFile = manager.resolveFile(sftpUri, opts);
// Copy local file to sftp server
localFile.copyFrom(remoteFile, Selectors.SELECT_SELF);
System.out.println("File download successful");
}
catch (Exception ex) {
ex.printStackTrace();
return false;
}
finally {
manager.close();
}
return true;
}
}
SFTP ব্যবহার করে দূরবর্তী সার্ভারে একটি ফাইল মুছুন
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.impl.StandardFileSystemManager;
import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder;
public class DeleteRemoteFile {
static Properties props;
public static void main(String[] args) {
DeleteRemoteFile getMyFiles = new DeleteRemoteFile();
if (args.length < 1)
{
System.err.println("Usage: java " + getMyFiles.getClass().getName()+
" Properties_filename File_To_Delete ");
System.exit(1);
}
String propertiesFilename = args[0].trim();
String fileToDownload = args[1].trim();
getMyFiles.startFTP(propertiesFilename, fileToDownload);
}
public boolean startFTP(String propertiesFilename, String fileToDownload){
props = new Properties();
StandardFileSystemManager manager = new StandardFileSystemManager();
try {
props.load(new FileInputStream("properties/" + 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();
//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 + fileToDownload;
//Create remote file object
FileObject remoteFile = manager.resolveFile(sftpUri, opts);
//Check if the file exists
if(remoteFile.exists()){
remoteFile.delete();
System.out.println("File delete successful");
}
}
catch (Exception ex) {
ex.printStackTrace();
return false;
}
finally {
manager.close();
}
return true;
}
}
হাইরিএনমাস / এসএসজেজে এসএফটিপি সংস্করণ 3 ( ওপেনএসএসএইচ প্রয়োগগুলি) এর সম্পূর্ণ বাস্তবায়ন রয়েছে
SFTPUpload.java থেকে উদাহরণ কোড
package net.schmizz.sshj.examples;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.sftp.SFTPClient;
import net.schmizz.sshj.xfer.FileSystemFile;
import java.io.File;
import java.io.IOException;
/** This example demonstrates uploading of a file over SFTP to the SSH server. */
public class SFTPUpload {
public static void main(String[] args)
throws IOException {
final SSHClient ssh = new SSHClient();
ssh.loadKnownHosts();
ssh.connect("localhost");
try {
ssh.authPublickey(System.getProperty("user.name"));
final String src = System.getProperty("user.home") + File.separator + "test_file";
final SFTPClient sftp = ssh.newSFTPClient();
try {
sftp.put(new FileSystemFile(src), "/tmp");
} finally {
sftp.close();
}
} finally {
ssh.disconnect();
}
}
}
জেএসচ লাইব্রেরি একটি শক্তিশালী গ্রন্থাগার যা এসএফটিপি সার্ভার থেকে ফাইল পড়তে ব্যবহার করা যেতে পারে। নীচে লাইনে এসএফটিপি লোকেশন লাইন থেকে ফাইল পড়ার জন্য পরীক্ষিত কোডটি দেওয়া হল
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("user", "127.0.0.1", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("password");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
InputStream stream = sftpChannel.get("/usr/home/testfile.txt");
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException io) {
System.out.println("Exception occurred during reading file from SFTP server due to " + io.getMessage());
io.getMessage();
} catch (Exception e) {
System.out.println("Exception occurred during reading file from SFTP server due to " + e.getMessage());
e.getMessage();
}
sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
পুরো প্রোগ্রামের জন্য দয়া করে ব্লগটি উল্লেখ করুন ।
অ্যান্ডি, রিমোট সিস্টেমে ফাইল মুছতে আপনার (channelExec)
জেএসচ ব্যবহার করতে হবে এবং এটি মুছতে ইউনিক্স / লিনাক্স কমান্ডগুলি পাস করতে হবে।
EdtFTPj / PRO চেষ্টা করুন , একটি পরিণত, শক্তিশালী SFTP ক্লায়েন্ট লাইব্রেরি যা সংযোগ পুল এবং অ্যাসিনক্রোনাস অপারেশনগুলিকে সমর্থন করে। এফটিপি এবং এফটিপিএস সমর্থন করে তাই নিরাপদ ফাইল স্থানান্তরের সমস্ত ঘাঁটি কভার করা হয়।
আমি JSCH API http://kodehelp.com/java-program-for-uploading-file-to-sftp-server/ ব্যবহার করে জাভাতে এসএফটিপি-র জন্য সম্পূর্ণ কাজের উদাহরণ পেয়েছি /
যদিও উপরের উত্তরগুলি খুব সহায়ক ছিল, আমি তাদের কাজ করতে একটি দিন অতিবাহিত করেছি, "ব্যর্থ চ্যানেল", "আরএসএ কী অজানা" এবং "প্যাকেট দূষিত" এর মতো বিভিন্ন ব্যতিক্রমের মুখোমুখি হয়েছি।
নীচে JSch লাইব্রেরি ব্যবহার করে SFTP ফাইলগুলি আপলোড / ডাউনলোড করার জন্য একটি পুনরায় ব্যবহারযোগ্য পুনরায় ব্যবহারযোগ্য শ্রেণি রয়েছে class
ব্যবহার আপলোড করুন:
SFTPFileCopy upload = new SFTPFileCopy(true, /path/to/sourcefile.png", /path/to/destinationfile.png");
ডাউনলোড ডাউনলোড:
SFTPFileCopy download = new SFTPFileCopy(false, "/path/to/sourcefile.png", "/path/to/destinationfile.png");
ক্লাস কোড:
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JOptionPane;
import menue.Menue;
public class SFTPFileCopy1 {
public SFTPFileCopy1(boolean upload, String sourcePath, String destPath) throws FileNotFoundException, IOException {
Session session = null;
Channel channel = null;
ChannelSftp sftpChannel = null;
try {
JSch jsch = new JSch();
//jsch.setKnownHosts("/home/user/.putty/sshhostkeys");
session = jsch.getSession("login", "mysite.com", 22);
session.setPassword("password");
UserInfo ui = new MyUserInfo() {
public void showMessage(String message) {
JOptionPane.showMessageDialog(null, message);
}
public boolean promptYesNo(String message) {
Object[] options = {"yes", "no"};
int foo = JOptionPane.showOptionDialog(null,
message,
"Warning",
JOptionPane.DEFAULT_OPTION,
JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
return foo == 0;
}
};
session.setUserInfo(ui);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
channel = session.openChannel("sftp");
channel.setInputStream(System.in);
channel.setOutputStream(System.out);
channel.connect();
sftpChannel = (ChannelSftp) channel;
if (upload) { // File upload.
byte[] bufr = new byte[(int) new File(sourcePath).length()];
FileInputStream fis = new FileInputStream(new File(sourcePath));
fis.read(bufr);
ByteArrayInputStream fileStream = new ByteArrayInputStream(bufr);
sftpChannel.put(fileStream, destPath);
fileStream.close();
} else { // File download.
byte[] buffer = new byte[1024];
BufferedInputStream bis = new BufferedInputStream(sftpChannel.get(sourcePath));
OutputStream os = new FileOutputStream(new File(destPath));
BufferedOutputStream bos = new BufferedOutputStream(os);
int readCount;
while ((readCount = bis.read(buffer)) > 0) {
bos.write(buffer, 0, readCount);
}
bis.close();
bos.close();
}
} catch (Exception e) {
System.out.println(e);
} finally {
if (sftpChannel != null) {
sftpChannel.exit();
}
if (channel != null) {
channel.disconnect();
}
if (session != null) {
session.disconnect();
}
}
}
public static abstract class MyUserInfo
implements UserInfo, UIKeyboardInteractive {
public String getPassword() {
return null;
}
public boolean promptYesNo(String str) {
return false;
}
public String getPassphrase() {
return null;
}
public boolean promptPassphrase(String message) {
return false;
}
public boolean promptPassword(String message) {
return false;
}
public void showMessage(String message) {
}
public String[] promptKeyboardInteractive(String destination,
String name,
String instruction,
String[] prompt,
boolean[] echo) {
return null;
}
}
}
আপনার এসএফটিপি অ্যাড-অন (জাভাও) এর সাথে জেফিলআপলোড রয়েছে: http://www.jfileupload.com/products/sftp/index.html
আমি জেহোন নামে এই এসএফটিপি এপিআই ব্যবহার করি, এটি দুর্দান্ত, প্রচুর নমুনা কোড সহ ব্যবহার করা সহজ। এই সাইটটি http://www.zehon.com
আমি যে সেরা সমাধানটি পেয়েছি তা হ'ল পরমিকো । একটি জাভা সংস্করণ আছে।