2008-10-14 24 views
66

जावा प्रोग्रामिंग भाषा के माध्यम से एक एसपीपी हस्तांतरण करने का सबसे अच्छा तरीका क्या है? ऐसा लगता है कि मैं इसे जेएसएसई, जेएसएच या उछाल वाले महल जावा पुस्तकालयों के माध्यम से करने में सक्षम हो सकता हूं। इनमें से कोई भी समाधान एक आसान जवाब प्रतीत नहीं होता है।जावा के माध्यम से scp

+2

आप बंद कर सकता है विभिन्न पुस्तकालयों के साथ आपके पास जो मुद्दे हैं, वे आपके लिए क्यों काम नहीं करते हैं? –

उत्तर

50

मैं Jsch का उपयोग कर समाप्त हुआ - यह बहुत सरल था, और बहुत अच्छी तरह से स्केल करना प्रतीत होता था (मैं हर कुछ मिनटों में कुछ हज़ार फाइलों को पकड़ रहा था)।

+0

जेएसएच बेहतर विकल्प बन गया, लेकिन दस्तावेज भयानक है। एंट्स एसपीपी कार्य को देखने के लिए अबारैक्स की नोक बहुत उपयोगी थी। यह वास्तव में स्पष्ट नहीं है कि परियोजना अभी भी बहुत सक्रिय है। पारितोषिक के लिए धन्यवाद। –

+23

@ लॉयडमेनहोल्ज़: मैंने इस पुस्तकालय के लिए [जावाडॉक्स] (http://epaul.github.com/jsch-documentation/simple.javadoc/) लिखा था। –

+0

पाउलो- बढ़िया काम! वे वास्तव में सहायक लगते हैं। –

2

openssh project कई जावा विकल्प सूचीबद्ध करता है, Trilead SSH for Java जो आप पूछ रहे हैं उसे ठीक करने के लिए लगता है।

+0

ट्राइलाड जेएसएच से ज्यादा परिपक्व प्रतीत होता है, लेकिन एसएफटीपी और एसपीपी समर्थन के साथ कमी आई थी, जो मैं बाद में था।वर्तमान में, एसएफटीपी केवल समर्थित है और रखता है (मुझे एलएस और आरएम भी चाहिए) और एसपीपी समर्थन अनुभवी के रूप में सूचीबद्ध किया गया था। –

16

एक नज़र here

चींटियों 'SCP कार्य के लिए स्रोत कोड है कि लो। "Execute" विधि में कोड वह जगह है जहां इसके नट और बोल्ट हैं। यह आपको आवश्यक चीज़ों का एक उचित विचार देना चाहिए। यह मेरा मानना ​​जेएसएच का उपयोग करता है।

वैकल्पिक रूप से आप सीधे अपने एंटी कार्य को अपने जावा कोड से निष्पादित कर सकते हैं।

2

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

17

प्लग: sshj केवल एकमात्र विकल्प है! शुरू करने के लिए इन उदाहरणों को देखें: download, upload

+4

केवल साइन विकल्प? –

+1

मैं जेएसएच पर एसएसजेड के साथ गया क्योंकि इसमें बहुत आसान इंटरफ़ेस था। – Chris

+0

@shikhar उदाहरण लिंक मर चुके हैं, क्या आप अपडेट कर सकते हैं? – BillMan

5

मैं यह थोड़ा दोस्ताना बनाने के लिए कुछ उपयोगिता के तरीकों के साथ Jsch लपेटा जाता है और यह

Jscp

यहाँ उपलब्ध बुलाया: एक फ़ोल्डर टार, यह ज़िप https://github.com/willwarren/jscp

SCP उपयोगिता, और यह scp कहीं, तो इसे अनजिप करें।

उपयोग:

// create secure context 
SecureContext context = new SecureContext("userName", "localhost"); 

// set optional security configurations. 
context.setTrustAllHosts(true); 
context.setPrivateKeyFile(new File("private/key")); 

// Console requires JDK 1.7 
// System.out.println("enter password:"); 
// context.setPassword(System.console().readPassword()); 

Jscp.exec(context, 
      "src/dir", 
      "destination/path", 
      // regex ignore list 
      Arrays.asList("logs/log[0-9]*.txt", 
      "backups") 
      ); 

इसके अलावा उपयोगी वर्ग शामिल है - Scp और Exec, और एक TarAndGzip, काफी में जो काम उसी तरह।

0

मैंने एक एसपीपी सर्वर लिखा जो दूसरों की तुलना में बहुत आसान है। मैं इसे विकसित करने के लिए अपाचे MINA प्रोजेक्ट (अपाचे एसएसएचडी) का उपयोग करता हूं। आप यहां एक नज़र डाल सकते हैं: https://github.com/boomz/JSCP इसके अलावा आप /jar निर्देशिका से जार फ़ाइल डाउनलोड कर सकते हैं। का उपयोग कैसे करें? इस पर एक नज़र डालें: https://github.com/boomz/JSCP/blob/master/src/Main.java

1

जेएसएच काम करने के लिए एक अच्छी लाइब्रेरी है। आपके प्रश्न के लिए इसका एक आसान जवाब है।

JSch jsch=new JSch(); 
    Session session=jsch.getSession(user, host, 22); 
    session.setPassword("password"); 


    Properties config = new Properties(); 
    config.put("StrictHostKeyChecking","no"); 
    session.setConfig(config); 
    session.connect(); 

    boolean ptimestamp = true; 

    // exec 'scp -t rfile' remotely 
    String command="scp " + (ptimestamp ? "-p" :"") +" -t "+rfile; 
    Channel channel=session.openChannel("exec"); 
    ((ChannelExec)channel).setCommand(command); 

    // get I/O streams for remote scp 
    OutputStream out=channel.getOutputStream(); 
    InputStream in=channel.getInputStream(); 

    channel.connect(); 

    if(checkAck(in)!=0){ 
    System.exit(0); 
    } 

    File _lfile = new File(lfile); 

    if(ptimestamp){ 
    command="T "+(_lfile.lastModified()/1000)+" 0"; 
    // The access time should be sent here, 
    // but it is not accessible with JavaAPI ;-< 
    command+=(" "+(_lfile.lastModified()/1000)+" 0\n"); 
    out.write(command.getBytes()); out.flush(); 
    if(checkAck(in)!=0){ 
     System.exit(0); 
    } 
    } 

आप मैं इन समाधानों में से एक बहुत कुछ देखा और उनमें से कई पसंद नहीं आया

http://faisalbhagat.blogspot.com/2013/09/java-uploading-file-remotely-via-scp.html

2

पर पूरा कोड पा सकते हैं। अधिकतर क्योंकि आपके ज्ञात मेजबानों की पहचान करने का कष्टप्रद कदम। वह और JSCH scp कमांड के सापेक्ष हास्यास्पद निम्न स्तर पर है।

मुझे एक लाइब्रेरी मिली जिसकी आवश्यकता नहीं है लेकिन इसे बंडल किया गया है और कमांड लाइन उपकरण के रूप में उपयोग किया जाता है।https://code.google.com/p/scp-java-client/

मैंने सोर्स कोड को देखा और कमांड लाइन के बिना इसका उपयोग कैसे किया। यहां अपलोड करने का एक उदाहरण दिया गया है:

uk.co.marcoratto.scp.SCP scp = new uk.co.marcoratto.scp.SCP(new uk.co.marcoratto.scp.listeners.SCPListenerPrintStream()); 
    scp.setUsername("root"); 
    scp.setPassword("blah"); 
    scp.setTrust(true); 
    scp.setFromUri(file.getAbsolutePath()); 
    scp.setToUri("[email protected]:/path/on/remote"); 
    scp.execute(); 

सबसे बड़ा नकारात्मक पक्ष यह है कि यह एक मैवेन रेपो (जो मुझे मिल सकता है) में नहीं है। लेकिन, उपयोग की आसानी मेरे लिए लायक है।

1

जेएससीएच ने मेरे लिए बहुत अच्छा काम किया है। नीचे एक विधि का एक उदाहरण है जो sftp सर्वर से कनेक्ट होगा और निर्दिष्ट निर्देशिका में फ़ाइलों को डाउनलोड करेगा। StrictHostKeyChecking को अक्षम करने से दूर रहने की अनुशंसा की जाती है। हालांकि स्थापित करने के लिए थोड़ा और मुश्किल है, ज्ञात मेजबान निर्दिष्ट करने के सुरक्षा कारणों के लिए मानक होना चाहिए।

jsch.setKnownHosts ("सी: \ उपयोगकर्ता \ test \ known_hosts"); अनुशंसित

JSch.setConfig ("StrictHostKeyChecking", "no"); - यहाँ

import com.jcraft.jsch.*; 
public void downloadFtp(String userName, String password, String host, int port, String path) { 


     Session session = null; 
     Channel channel = null; 
     try { 
      JSch ssh = new JSch(); 
      JSch.setConfig("StrictHostKeyChecking", "no"); 
      session = ssh.getSession(userName, host, port); 
      session.setPassword(password); 
      session.connect(); 
      channel = session.openChannel("sftp"); 
      channel.connect(); 
      ChannelSftp sftp = (ChannelSftp) channel; 
      sftp.get(path, "specify path to where you want the files to be output"); 
     } catch (JSchException e) { 
      System.out.println(userName); 
      e.printStackTrace(); 


     } catch (SftpException e) { 
      System.out.println(userName); 
      e.printStackTrace(); 
     } finally { 
      if (channel != null) { 
       channel.disconnect(); 
      } 
      if (session != null) { 
       session.disconnect(); 
      } 
     } 

    } 
1

अनुशंसित नहीं कुछ तरह, मैं JSch पुस्तकालय के चारों ओर एक आवरण लेखन समाप्त हो गया।

यह रास्ता-secshell कहा जाता है और यह GitHub पर होस्ट किया गया है:

https://github.com/objectos/way-secshell

// scp myfile.txt localhost:/tmp 
File file = new File("myfile.txt"); 
Scp res = WaySSH.scp() 
    .file(file) 
    .toHost("localhost") 
    .at("/tmp") 
    .send(); 
4

यह उच्च स्तरीय समाधान, को बदलने की कोई जरूरत नहीं है। जल्दी और गन्दी!

1) सबसे पहले, http://ant.apache.org/bindownload.cgi पर जाएं और नवीनतम अपाचे चींटी बाइनरी डाउनलोड करें। (आजकल, apache-ant-1.9.4-bin.zip)।

2) डाउनलोड की गई फ़ाइल निकालें और जार चींटी-jsch.jar ("अपाचे-चींटी-1.9.4/lib/चींटी-jsch.jar") लगता है। अपनी परियोजना में इस JAR को जोड़ें। इसके अलावा चींटी-launcher.jar और ant.jar।

3)Jcraft jsch SouceForge Project पर जाएं और जार डाउनलोड करें। आजकल, jsch-0.1.52.jarअपनी परियोजना में यह JAR जोड़ें

अब, आप easyly नेटवर्क या SSH सर्वर में आदेश के लिए SSHExec से अधिक चींटी क्लासेस Scp प्रतिलिपि फ़ाइलों के लिए जावा कोड में उपयोग कर सकते हैं।

4) कोड उदाहरण Scp:

// This make scp copy of 
// one local file to remote dir 

org.apache.tools.ant.taskdefs.optional.ssh.Scp scp = new Scp(); 
int portSSH = 22; 
String srvrSSH = "ssh.your.domain"; 
String userSSH = "anyuser"; 
String pswdSSH = new String (jPasswordField1.getPassword()); 
String localFile = "C:\\localfile.txt"; 
String remoteDir = "/uploads/"; 

scp.setPort(portSSH); 
scp.setLocalFile(localFile); 
scp.setTodir(userSSH + ":" + pswdSSH + "@" + srvrSSH + ":" + remoteDir); 
scp.setProject(new Project()); 
scp.setTrust(true); 
scp.execute(); 
+0

मैं इसे आजमा रहा हूं लेकिन अगर कोई समाधान है तो कृपया त्रुटि प्राप्त करें ---> com.jcraft.jsch.JSchException: सत्र। कनेक्ट: java.security.NoSuchAlgorithmException: एल्गोरिदम डीएच उपलब्ध नहीं है –

+1

यदि आपको त्वरित समाधान की आवश्यकता है तो यह काम करता है जादू और सीधे जेएसएच का उपयोग करके अधिक सरल आवंटित, धन्यवाद। –

0

मैं रिकर्सिवली फ़ोल्डर की प्रतिलिपि करने, विभिन्न समाधान की कोशिश कर के बाद की जरूरत है, अंत में ProcessBuilder द्वारा खत्म + उम्मीद/अंडे

scpFile("192.168.1.1", "root","password","/tmp/1","/tmp"); 

public void scpFile(String host, String username, String password, String src, String dest) throws Exception { 

    String[] scpCmd = new String[]{"expect", "-c", String.format("spawn scp -r %s %[email protected]%s:%s\n", src, username, host, dest) + 
      "expect \"?assword:\"\n" + 
      String.format("send \"%s\\r\"\n", password) + 
      "expect eof"}; 

    ProcessBuilder pb = new ProcessBuilder(scpCmd); 
    System.out.println("Run shell command: " + Arrays.toString(scpCmd)); 
    Process process = pb.start(); 
    int errCode = process.waitFor(); 
    System.out.println("Echo command executed, any errors? " + (errCode == 0 ? "No" : "Yes")); 
    System.out.println("Echo Output:\n" + output(process.getInputStream())); 
    if(errCode != 0) throw new Exception(); 
} 
संबंधित मुद्दे