SFTP के माध्यम से सर्वर से फ़ाइल कैसे प्राप्त करें?


228

मैं जावा का उपयोग करके एसएफटीपी (एफटीपीएस के विपरीत) का उपयोग कर एक सर्वर से एक फ़ाइल को पुनः प्राप्त करने की कोशिश कर रहा हूं। मैं यह कैसे कर सकता हूँ?

जवाबों:


198

एक अन्य विकल्प JSch लाइब्रेरी को देखने पर विचार करना है । जेएसएच कुछ बड़े ओपन सोर्स प्रोजेक्ट्स के लिए पसंदीदा लाइब्रेरी है, जिसमें ग्रहण, एंट और अपाचे कॉमन्स एचटीटीपी क्लाइंट शामिल हैं।

यह उपयोगकर्ता / पास और प्रमाणपत्र-आधारित लॉगिन दोनों को अच्छी तरह से समर्थन करता है, साथ ही साथ अन्य सभी स्वादिष्ट SSH2 सुविधाओं की पूरी मेजबानी भी करता है।

यहां SFTP पर एक साधारण रिमोट फ़ाइल प्राप्त होती है। त्रुटि से निपटने को पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है :-)

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
Cheekysoft, मैंने देखा - Jsch का उपयोग करते समय - sftp-server पर फ़ाइलों को हटाने से काम नहीं होता है। फ़ाइलों का नाम बदलने से भी काम नहीं बनता है। किसी भी विचार कृपया ??? एंडी

1
क्षमा करें, यह कुछ ऐसा नहीं है जो मैं फिलहाल काम करता हूं। (कृपया इस तरह की प्रतिक्रियाओं को टिप्पणियों के रूप में आज़माएँ और छोड़ें - इस संदेश की तरह - और मूल प्रश्न के नए उत्तर के रूप में नहीं)
चेकिसॉफ्ट

1
सत्र के असाइनमेंट के बाद वह कोड ब्लॉक क्या है? क्या कुछ फैंसी जावा सिंटैक्स मैंने कभी नहीं देखा है? यदि ऐसा है - तो यह इस तरह से लिखा जा रहा है क्या पूरा करता है?
माइकल पीटरसन

3
@ p1x3l5 मानक जावा सिंटैक्स एक ब्लॉक को कहीं भी डालने की अनुमति देता है; यदि आप चाहें तो इसे चर दायरे पर बेहतर नियंत्रण प्रदान करने के लिए इस्तेमाल किया जा सकता है। हालांकि, इस मामले में, यह दो कार्यान्वयन विकल्पों को इंगित करने में मदद करने के लिए सिर्फ एक दृश्य सहायता है: या तो इंटरैक्टिव संस्करण का उपयोग करें जो उपयोगकर्ता से पासवर्ड का अनुरोध करता है, या हार्डकोड पासवर्ड का उपयोग करता है, जिसमें उपयोगकर्ता के हस्तक्षेप की आवश्यकता नहीं होती है, लेकिन यकीनन एक अतिरिक्त सुरक्षा जोखिम है।
1037 पर चेकिसॉफ्ट

109

यहाँ ssh कुंजी जाँच के बारे में चिंता किए बिना JSch का उपयोग करके एक उदाहरण का पूरा स्रोत कोड है ।

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चैनल को क्लीन-अप कोड को शामिल करने के लिए एक ब्लॉक का उपयोग किया जाना चाहिए, ताकि यह सुनिश्चित हो सके कि यह हमेशा चलता रहे।
hotshot309

मुझे अब यह अपवाद मिल रहा है: 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

मैंने पाया कि JSCH को 0 या 1 अतिरिक्त निर्भरता है। यदि आप संपीड़न को अक्षम करते हैं तो आप JZLIB निर्भरता को अनदेखा कर सकते हैं। // अक्षम संपीड़न सत्र ।सेटकॉन्फिग ("संपीड़न.एस 2 सी", "कोई नहीं"); session.setConfig ("compress.c2s", "none");
13

1
सख्त मेजबान जाँच के बिना आप एक आदमी के बीच में हमले के लिए अतिसंवेदनशील होते हैं।
Rustyx

44

नीचे Apache Common VFS का उपयोग करके एक उदाहरण दिया गया है:

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);
स्कॉट जोन्स

एक ही समय में कई SFTP क्लाइंट का उपयोग करते समय आप इस कनेक्शन को कैसे बंद करने की सलाह देंगे?
2Big2BeSmall

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

Jsch के शीर्ष पर एक अच्छा अमूर्त अपाचे कॉमन्स-वीएफ़एस है जो एक आभासी फाइल सिस्टम एपीआई प्रदान करता है जो एसएफटीपी फाइलों तक पहुंच और लेखन लगभग पारदर्शी बनाता है। हमारे लिए अच्छा काम किया।


1
क्या कॉमन्स-वीएफ़एस के साथ संयोजन में पूर्व-साझा कुंजी का उपयोग करना संभव है?
बेनेडिकट वाल्डवोगेल

2
हाँ यही है। यदि आपको गैर-मानक पहचान की आवश्यकता है, तो आप SftpFileSystemConfigBuilder.getInance ()। SetIdentities (...) कह सकते हैं।
रस हेवर्ड

आप पूर्व-साझा कुंजी का उपयोग कर सकते हैं। लेकिन यह चाबियाँ पासवर्ड के बिना होनी चाहिए। OtrosLogViewer VFS के साथ SSH कुंजी प्राधिकरण का उपयोग कर रहा है, लेकिन कुंजी से कूटशब्द निकालने की आवश्यकता है ( code.google.com/p/otroslogviewer/wiki/SftpAuthPubKey )
KrzyH

19

SFTP के लिए 3 परिपक्व जावा पुस्तकालयों की एक अच्छी तुलना है: कॉमन्स VFS, SSHJ और JSch

SSHJ को योग करने के लिए सबसे स्पष्ट एपीआई है और यदि कॉमन्स एफएफएस द्वारा प्रदान किए गए अन्य स्टोरेज सपोर्ट की आवश्यकता नहीं है तो यह उनमें से सबसे अच्छा है।

यहाँ संपादित किया गया है 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
क्या फ़ाइल को InputStream के रूप में प्राप्त करने का कोई तरीका है?
जोहान

2
2019 में SSHJ अभी भी अच्छी तरह से बनाए रखा है और Alpakka (अक्का) द्वारा किया जाता है परियोजना
मैक्सेसंस

13

Apache Commons SFTP लाइब्रेरी

सभी उदाहरणों के लिए सामान्य जावा गुण फ़ाइल

serverAddress = 111.222.333.444

userId = myUserId

पासवर्ड = mypassword

remoteDirectory = उत्पादों /

Localdirectory = आयात /

SFTP का उपयोग करके दूरस्थ सर्वर पर फ़ाइल अपलोड करें

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


}

SFTP का उपयोग करके दूरस्थ सर्वर से फ़ाइल डाउनलोड करें

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 (सार्वजनिक कुंजी) होने पर कॉन्फ़िगर कैसे करें। क्योंकि मुझे अपने सर्वर और रिमोट सर्वर के बीच ssh_trust बनाने की आवश्यकता है।
एमएस परमार

7

hierynomus / sshj में SFTP संस्करण 3 (क्या OpenSSH लागू होता है) का पूर्ण कार्यान्वयन है

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

JSch लाइब्रेरी एक शक्तिशाली लाइब्रेरी है जिसका उपयोग SFTP सर्वर से फाइल को पढ़ने के लिए किया जा सकता है। एसएफटीपी लोकेशन लाइन से फाइल को पढ़ने के लिए नीचे दिया गया कोड है

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 / प्रो , एक परिपक्व, मजबूत SFTP क्लाइंट पुस्तकालय है कि समर्थन करता है कनेक्शन पूल और अतुल्यकालिक संचालन। एफ़टीपी और एफटीपीएस का भी समर्थन करता है इसलिए सुरक्षित फ़ाइल स्थानांतरण के लिए सभी आधारों को कवर किया गया है।



2

हालांकि ऊपर दिए गए उत्तर बहुत मददगार थे, मैंने उन्हें "टूटा हुआ चैनल", "आरएसए कुंजी अज्ञात" और "पैकेट भ्रष्ट" जैसे विभिन्न अपवादों का सामना करने के लिए एक दिन बिताया है।

नीचे JSTP लाइब्रेरी का उपयोग करके SFTP FILES UPLOAD / DOWNLOAD के लिए एक कार्यशील पुन: प्रयोज्य वर्ग है।

उपयोग अपलोड करें:

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

आपके पास SFTP ऐड-ऑन (जावा भी) के साथ JFileUpload है: http://www.jfileupload.com/products/sftp/index.html


JFileUpload एक एप्लेट है, न कि एक परिवाद। लाइसेंस व्यावसायिक है। सक्रिय नहीं दिखता है, या तो।
rü- 15

1

मैं इस SFTP एपीआई का उपयोग करता हूं जिसे Zehon कहा जाता है, यह बहुत अच्छा है, इसलिए बहुत सारे नमूना कोड के साथ उपयोग करना आसान है। यहाँ साइट http://www.zehon.com है


2
ज़ेहन मर चुका लगता है। और स्रोत कहां है? 'मुक्त' के पीछे क्या 'लाइसेंस' है?
rü- 15

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.