SFTP এর মাধ্যমে সার্ভার থেকে কোনও ফাইল পুনরুদ্ধার করবেন কীভাবে?


228

আমি জাভা ব্যবহার করে এসএফটিপি (এফটিপিএসের বিপরীতে) ব্যবহার করে একটি সার্ভার থেকে একটি ফাইল পুনরুদ্ধার করার চেষ্টা করছি। কিভাবে আমি এটি করতে পারব?

উত্তর:


198

আরেকটি বিকল্প হ'ল জেএসএইচ লাইব্রেরির দিকে তাকানো বিবেচনা করা । জেএসসি বেশ কয়েকটি বৃহত ওপেন সোর্স প্রকল্পগুলির জন্য অন্যান্য গ্রাহকদের মধ্যে এক্লিপস, এন্টি এবং অ্যাপাচি কমন্স এইচটিপিপ্লিনেন্ট সহ পছন্দসই গ্রন্থাগার বলে মনে হচ্ছে।

এটি ব্যবহারকারীর / পাস এবং শংসাপত্র ভিত্তিক লগইনগুলি উভয় সমর্থন করে, পাশাপাশি অন্যান্য মুখরোচক এসএসএইচ 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();

1
চেকসিসফ্ট, আমি লক্ষ্য করেছি - জ্যাচ ব্যবহার করার সময় - এসএফটিপি-সার্ভারে ফাইলগুলি সরিয়ে ফেলা কোনও কাজ করে না। ফাইলগুলির নাম পরিবর্তন করাও খুব বেশি কাজ করে না। কোন ধারণা দয়া করে ??? অ্যান্ডি

1
দুঃখিত, আমি এই মুহুর্তে কাজ করি এমন কিছু নয়। (দয়া করে চেষ্টা করুন এবং এই ধরণের প্রতিক্রিয়া মন্তব্য হিসাবে মন্তব্য করুন - এই বার্তাটির মতো - এবং মূল প্রশ্নের নতুন উত্তর হিসাবে নয়)
চেকসফট

1
সেশন বরাদ্দের পরে সেই কোড ব্লকটি কী? এটি কি কোনও অভিনব জাভা বাক্য গঠন যা আমি কখনও দেখিনি? যদি তাই হয় - সেভাবে লেখাটি কী সম্পাদন করে?
মাইকেল পিটারসন

3
@ p1x3l5 স্ট্যান্ডার্ড জাভা সিনট্যাক্স একটি ব্লককে যে কোনও জায়গায় beোকাতে দেয়; আপনি যদি চান তবে এটি ভেরিয়েবল স্কোপের উপর সূক্ষ্ম নিয়ন্ত্রণ প্রদান করতে ব্যবহৃত হতে পারে। যাইহোক, এই ক্ষেত্রে, এটি দুটি বাস্তবায়ন পছন্দগুলি নির্দেশ করতে সহায়তা করার জন্য কেবল একটি চাক্ষুষ সহায়তা: ব্যবহারকারীর কাছ থেকে পাসওয়ার্ডের অনুরোধ করে এমন ইন্টারেক্টিভ সংস্করণ ব্যবহার করুন, বা কোনও ব্যবহারকারীর হস্তক্ষেপের প্রয়োজন হয় না এমন একটি হার্ডকোডযুক্ত পাসওয়ার্ড ব্যবহার করুন তবে তাত্ক্ষণিকভাবে একটি অতিরিক্ত সুরক্ষা ঝুঁকি রয়েছে।
Cheekysoft

109

এখানে এসএস কী পরীক্ষার বিষয়ে চিন্তা না করে জেএসচ ব্যবহার করে একটি উদাহরণের সম্পূর্ণ উত্স কোড 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();
        }
    }
}

15
finallyচ্যানেলটি ক্লিন-আপ কোড অন্তর্ভুক্ত করতে একটি ব্লক ব্যবহার করা উচিত, এটি সর্বদা চালিত হয় তা নিশ্চিত করার জন্য।
হটশট 309

আমি এখন এই ব্যতিক্রম পাচ্ছি: 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)
anon58192932

আমি জেএসসিএকে 0 বা 1 অতিরিক্ত নির্ভরতা পেয়েছি। আপনি যদি সংক্ষেপণ অক্ষম করেন তবে আপনি JZLIB নির্ভরতা উপেক্ষা করতে পারেন। // অক্ষম করুন সংক্ষেপণ অধিবেশন.সেটকনফিগ ("সংক্ষেপণ.এস 2 সি", "কিছুই নয়"); অধিবেশন.সেটকনফিগ ("সংক্ষেপণ.২2", "কিছুই নয়");
englebart

1
কঠোর হোস্ট পরীক্ষা না করে আপনি মধ্য-আক্রমণের জন্য একজন সংবেদনশীল।
রুস্টেক্স

44

নীচে অ্যাপাচি কমন ভিএফএস ব্যবহার করে একটি উদাহরণ দেওয়া হল:

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);

5
আর একটি দুর্দান্ত কাজটি হ'ল সময়সীমা নির্ধারণ করা, যাতে দূরবর্তী সিস্টেমটি অফলাইনে থাকে তবে আপনি সেখানে চিরতরে স্তব্ধ হন না। হোস্ট কী চেক নিষ্ক্রিয় করার জন্য যেমন করা হয়েছিল ঠিক তেমন আপনি এটি করতে পারেন: SftpFileSystemConfigBuilder.getInstance ()। SetTimeout (fsOptions, 5000);
স্কট জোনস

একই সময়ে একাধিক এসএফটিপি ক্লায়েন্ট ব্যবহার করার সময় আপনি কীভাবে এই সংযোগটি বন্ধ করার পরামর্শ দিবেন?
বিগ

2
আমার পাসওয়ার্ডে @ চিহ্ন থাকলে কী হবে?
ব্যবহারকারী 3

23

এই সমাধানটিই আমি 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();

7
আমি সম্মত (নির্জনে), এটি আমার প্রয়োজনীয় মূল সাইট / ডাউনলোডের জন্য দুর্দান্ত কাজ করেছে তবে এটি নতুনটির জন্য কাজ করতে প্রত্যাবর্তন করেছে। আমি জেএসচে স্যুইচ করার প্রক্রিয়া করছি
ডেভিড হেইস

23

জেএসচের শীর্ষে একটি দুর্দান্ত বিমূর্ততা হ'ল অ্যাপাচি কমন্স-ভিএফএস যা একটি ভার্চুয়াল ফাইল সিস্টেম API দেয় যা এসএফটিপি ফাইলগুলিকে অ্যাক্সেস এবং লেখাকে প্রায় স্বচ্ছ করে তোলে। আমাদের জন্য ভাল কাজ করেছে।


1
কমন্স-ভিএফএসের সাথে একত্রে প্রাক-ভাগ করা কীগুলি ব্যবহার করা সম্ভব?
বেনিডিক্ট ওয়াল্ডভোগেল

2
হ্যাঁ তাই হয়। যদি আপনার অ-মানক পরিচয় প্রয়োজন হয় তবে আপনি SftpFileSystemConfigBuilder.getInstance ()। SetIdentities (...) কল করতে পারেন।
রাশ হ্যাওয়ার্ড

আপনি প্রাক-ভাগ করা কী ব্যবহার করতে পারেন। তবে এই কীগুলি পাসওয়ার্ড ছাড়াই থাকতে হবে। ওট্রোগলগভিউয়ার ভিএফএসের সাথে এসএসএইচ কী অনুমোদন ব্যবহার করছে তবে কী (কোড. google.com/p/otroslogviewer/wiki/SftpAuthPubKey ) থেকে পাসফ্রেজ অপসারণ করতে হবে
ক্রিজিএইচ

19

এসএফটিপি: কমন্স ভিএফএস, এসএসএইচজে এবং জেএসএচের 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();
}

2
ইনপুট স্ট্রিম হিসাবে ফাইলটি পাওয়ার কোনও উপায় আছে কি?
জোহান

2
2019 সালে sshj এখনও ভাল রক্ষণাবেক্ষণ করা হয় এবং আলপাক্কা (আক্কা) প্রকল্প দ্বারা ব্যবহৃত হয়
ম্যাক্সেন্স

13

অ্যাপাচি কমন্স এসএফটিপি লাইব্রেরি

সমস্ত উদাহরণের জন্য সাধারণ জাভা বৈশিষ্ট্য ফাইল

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;
 }

}


সার্ভারে ফাইলগুলি অনুলিপি করতে কীভাবে কনফিগার করবেন ssh-key (সর্বজনীন কী) to কারণ আমার সার্ভার এবং রিমোট সার্ভারের মধ্যে আমার ssh_trust তৈরি করা দরকার।
এমএস পারমার

7

হাইরিএনমাস / এসএসজেজে এসএফটিপি সংস্করণ 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();
        }
    }

}

2
চমৎকার কাজ!! মূল পৃষ্ঠায় একটি উদাহরণ যদিও সহায়ক হতে পারে।
ওহাদআর 4'15

4

জেএসচ লাইব্রেরি একটি শক্তিশালী গ্রন্থাগার যা এসএফটিপি সার্ভার থেকে ফাইল পড়তে ব্যবহার করা যেতে পারে। নীচে লাইনে এসএফটিপি লোকেশন লাইন থেকে ফাইল পড়ার জন্য পরীক্ষিত কোডটি দেওয়া হল

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();
        }

পুরো প্রোগ্রামের জন্য দয়া করে ব্লগটি উল্লেখ করুন ।


3

অ্যান্ডি, রিমোট সিস্টেমে ফাইল মুছতে আপনার (channelExec)জেএসচ ব্যবহার করতে হবে এবং এটি মুছতে ইউনিক্স / লিনাক্স কমান্ডগুলি পাস করতে হবে।


2

EdtFTPj / PRO চেষ্টা করুন , একটি পরিণত, শক্তিশালী SFTP ক্লায়েন্ট লাইব্রেরি যা সংযোগ পুল এবং অ্যাসিনক্রোনাস অপারেশনগুলিকে সমর্থন করে। এফটিপি এবং এফটিপিএস সমর্থন করে তাই নিরাপদ ফাইল স্থানান্তরের সমস্ত ঘাঁটি কভার করা হয়।



2

যদিও উপরের উত্তরগুলি খুব সহায়ক ছিল, আমি তাদের কাজ করতে একটি দিন অতিবাহিত করেছি, "ব্যর্থ চ্যানেল", "আরএসএ কী অজানা" এবং "প্যাকেট দূষিত" এর মতো বিভিন্ন ব্যতিক্রমের মুখোমুখি হয়েছি।

নীচে 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;
        }
    }
}

1

আপনার এসএফটিপি অ্যাড-অন (জাভাও) এর সাথে জেফিলআপলোড রয়েছে: http://www.jfileupload.com/products/sftp/index.html


জেফিলআপলোড একটি অ্যাপলেট, কোনও লিবিব নয়। লাইসেন্স বাণিজ্যিক। সক্রিয়ও দেখায় না।
rü-

1

আমি জেহোন নামে এই এসএফটিপি এপিআই ব্যবহার করি, এটি দুর্দান্ত, প্রচুর নমুনা কোড সহ ব্যবহার করা সহজ। এই সাইটটি http://www.zehon.com


2
জেহোন মারা গেছে বলে মনে হচ্ছে। আর সোর্সটা কোথায়? 'ফ্রি' এর পিছনে কী 'লাইসেন্স' রয়েছে?
rü-

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.