জাভার জন্য এসএসএইচ পাঠাগার [বন্ধ]


189

জাভা থেকে এসএসএইচ লগইন করার জন্য কেউ কি কোনও ভাল লাইব্রেরি জানেন?


আমি ট্রাইলেড এসএসএইচ ব্যবহার করতাম তবে আজ যখন আমি সাইটটি পরীক্ষা করেছিলাম তখন মনে হয় তারা এটি ছেড়ে দিচ্ছে। :( এটি আমার পরম প্রিয় ছিল
পিটার ডি

1
বিটিডাব্লু, দেখা যাচ্ছে যে ট্রিলিয়াড এসএসএইচ 2 সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হচ্ছে (অক্টোবরে 2013): [ github.com/jenkinsci/trilead-ssh2]
মাইক গডিন

Trilead SSH2 এ একটি কাঁটাচামচ হয়েছে github.com/connectbot/sshlib
user7610

উত্তর:


120

জাভা নিরাপদ চ্যানেল (JSCH) একটি খুব জনপ্রিয় গ্রন্থাগার, ম্যাভেন, পিপীলিকা এবং অন্ধকার ব্যবহার করে থাকেন। এটি একটি বিএসডি স্টাইল লাইসেন্স সহ ওপেন সোর্স।


2
আপনি এর থেকে উৎস ডাউনলোড করতে eed sourceforge.net/projects/jsch/files/jsch/jsch-0.1.42.zip/... এবং চালান "পিপীলিকা javadoc"
ডেভিড Rabinowitz

73
আমি কিছুদিন আগে জেএসচ ব্যবহার করার চেষ্টা করেছি এবং বুঝতে পারি না কীভাবে এটি এত জনপ্রিয় হয়েছিল। এটি একেবারে কোনও ডকুমেন্টেশন (এমনকি উত্সের মধ্যেও নয়) এবং একটি ভয়াবহ এপিআই নকশা সরবরাহ করে ( techtavern.wordpress.com/2008/09/30/… এটির বেশিরভাগ পরিমাণ যোগ করে)
rluba

15
হ্যাঁ জ্যাশ ভয়ঙ্কর, এটি আরও ভাল: github.com/shikhar/sshj
anio

3
পাবলিক পদ্ধতির জন্য জ্যাভডোক সহ জেএসচের একটি বৈকল্পিক: github.com/ePaul/jsch-docamentation
user423430

4
stackoverflow.com/questions/2405885/any-good-jsch-examples/... JSCH ব্যবহার কমান্ড সঞ্চালন করুন এবং আউটপুট পেতে জন্য একটি উদাহরণ রয়েছে।
দাতব্য লেসচিনস্কি

65

আপডেট: জিএসওসি প্রকল্প এবং কোডটি সক্রিয় নেই, তবে এটি হ'ল: https://github.com/hierynomus/sshj

হাইরিএনমাস ২০১৫ সালের প্রথম দিক থেকে রক্ষণাবেক্ষণকারী হিসাবে দায়িত্ব গ্রহণ করেছিলেন Here এখানে পুরানো, আর রক্ষণাবেক্ষণ করা হবে না, গিথুব লিঙ্ক:

https://github.com/shikhar/sshj


একটি জিএসওসি প্রকল্প ছিল:

http://code.google.com/p/commons-net-ssh/

কোডের মানটি জেএসচের চেয়ে ভাল বলে মনে হচ্ছে, যা একটি সম্পূর্ণ এবং কার্যকরী বাস্তবায়নকালে ডকুমেন্টেশনের অভাব রয়েছে। প্রকল্প পৃষ্ঠাটি একটি আসন্ন বিটা রিলিজ স্পট করে, সংগ্রহশালায় শেষ প্রতিশ্রুতি ছিল মধ্য-আগস্ট।

API গুলি তুলনা করুন:

http://code.google.com/p/commons-net-ssh/

    SSHClient ssh = new SSHClient();
    //ssh.useCompression(); 
    ssh.loadKnownHosts();
    ssh.connect("localhost");
    try {
        ssh.authPublickey(System.getProperty("user.name"));
        new SCPDownloadClient(ssh).copy("ten", "/tmp");
    } finally {
        ssh.disconnect();
    }

http://www.jcraft.com/jsch/

Session session = null;
Channel channel = null;

try {

JSch jsch = new JSch();
session = jsch.getSession(username, host, 22);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(password);
session.connect();

// exec 'scp -f rfile' remotely
String command = "scp -f " + remoteFilename;
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();

byte[] buf = new byte[1024];

// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();

while (true) {
    int c = checkAck(in);
    if (c != 'C') {
        break;
    }

    // read '0644 '
    in.read(buf, 0, 5);

    long filesize = 0L;
    while (true) {
        if (in.read(buf, 0, 1) < 0) {
            // error
            break;
        }
        if (buf[0] == ' ') {
            break;
        }
        filesize = filesize * 10L + (long) (buf[0] - '0');
    }

    String file = null;
    for (int i = 0;; i++) {
        in.read(buf, i, 1);
        if (buf[i] == (byte) 0x0a) {
            file = new String(buf, 0, i);
            break;
        }
    }

    // send '\0'
    buf[0] = 0;
    out.write(buf, 0, 1);
    out.flush();

    // read a content of lfile
    FileOutputStream fos = null;

    fos = new FileOutputStream(localFilename);
    int foo;
    while (true) {
        if (buf.length < filesize) {
            foo = buf.length;
        } else {
            foo = (int) filesize;
        }
        foo = in.read(buf, 0, foo);
        if (foo < 0) {
            // error
            break;
        }
        fos.write(buf, 0, foo);
        filesize -= foo;
        if (filesize == 0L) {
            break;
        }
    }
    fos.close();
    fos = null;

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

    // send '\0'
    buf[0] = 0;
    out.write(buf, 0, 1);
    out.flush();

    channel.disconnect();
    session.disconnect();
}

} catch (JSchException jsche) {
    System.err.println(jsche.getLocalizedMessage());
} catch (IOException ioe) {
    System.err.println(ioe.getLocalizedMessage());
} finally {
    channel.disconnect();
    session.disconnect();
}

}

2
ধন্যবাদ! আমি অ্যাপাচি এসএসএইচডি কোড (যা একটি অ্যাসিঙ্ক এপিআই সরবরাহ করে) বীজ হিসাবে ব্যবহার করেছি যা প্রকল্পটিকে একটি কিকস্টার্ট দিয়েছে।
শিখর

1
গ্রেট। আমি জেএসচ ব্যবহার করে একটি প্রকল্প শুরু করেছি, তবে আমি যদি কমন্স-নেট-এসএসএস সম্পর্কে আরও ইতিবাচক প্রতিক্রিয়া শুনতে পাই তবে আমি সত্যিই স্যুইচ করতে চাই।
মিকু

5
আমার উল্লেখ করা উচিত ছিল যে আমি জিএসওসি ছাত্র ছিলাম :)
শিখর

2
github.com/shikhar/sshj ঘোষণা করে খুশি - আপনি সেখানে জার খুঁজে পেতে পারেন, এটি কোনও মাভেন রেপোতে পাবেন কীভাবে তা
শিখতে পারেন

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

24

আমি সবে এসএসজে আবিষ্কার করেছি , যার মনে হচ্ছে জেএসসিএইচের চেয়ে অনেক বেশি সংক্ষিপ্ত এপিআই রয়েছে (তবে এটি জাভা 6 প্রয়োজন)। ডকুমেন্টেশনটি বেশিরভাগ ক্ষেত্রে এই সময়ে-ইন-দ্য-রেপো উদাহরণগুলির দ্বারা হয়, এবং সাধারণত আমার পক্ষে অন্য কোথাও দেখার পক্ষে এটি যথেষ্ট but তবে আমি সবেমাত্র শুরু করা একটি প্রকল্পে এটির জন্য আমার পক্ষে যথেষ্ট যথেষ্ট মনে হয়।


3
এসএসএইচজে আসলে বাইরের বিশ্বের যে কেউ কার্যক্ষম work জেএসসিএইচ লুকানো এবং মূলত অনিবার্য নির্ভরতা সহ খারাপ ডকুমেন্টেশন এবং এপিআই ডিজাইনের একটি জগাখিচুড়ি। আপনি কী করছেন তা বের করার চেষ্টা করার জন্য কোডের মধ্য দিয়ে প্রচুর সময় ব্যয় করতে না চাইলে এসএসএইচজে ব্যবহার করুন। (এবং আমি আশা করি আমি জেএসসিএইচ সম্পর্কে কঠোর বা উত্সাহী হয়েছি I আমি সত্যিই এটি করি))
রবার্ট ফিশার

1
হ্যাঁ, এসএসজে আমি এটি দিয়ে যা কিছু চেষ্টা করেছি তা কাজ করেছে: এসসিপি, দূরবর্তী প্রক্রিয়া সম্পাদন, স্থানীয় এবং দূরবর্তী পোর্ট ফরওয়ার্ডিং, জেএসএচ-এজেন্ট-প্রক্সি সহ এজেন্ট প্রক্সি । জেএসসিএইচ গণ্ডগোল হয়েছিল।
লরেন্ট কাইললেট

1
এসএসএইচজে সমস্যাটি হ'ল একাধিক কমান্ড কার্যকর করা খুব কঠিন। কমান্ডগুলি অগ্নি-বিস্মৃত করার জন্য এসএসএইচজে দুর্দান্ত হতে পারে তবে আপনি যদি আরও জটিল মিথস্ক্রিয়াকে প্রোগ্রাম করতে চান তবে এটি একটি ব্যথা। (আমি এটিতে কেবল অর্ধেক দিন নষ্ট করেছি)
bvdb

18

অ্যাপাচি মিনা প্রকল্পের উপর ভিত্তি করে খুব সম্প্রতি প্রকাশিত এসএসএইচডি একবার দেখুন ।


2
এটি ব্যবহার করে, তবে এখানে ডকুমেন্টেশন এবং উদাহরণগুলির অভাব রয়েছে।
আন্দ্রেয়াস ম্যাটিসন

দেখে মনে হচ্ছে নথির অভাব এটিকে হালকাভাবে
রাখছে

5

গিথুবটিতে জ্যাশ আপের একদম নতুন সংস্করণ রয়েছে: https://github.com/vngx/vngx-jsch কিছু উন্নতির মধ্যে রয়েছে: বিস্তৃত জাভাডোক, বর্ধিত কর্মক্ষমতা, উন্নত ব্যতিক্রম হ্যান্ডলিং এবং আরও ভাল আরএফসি স্পেক আনুগত্য। আপনি যদি কোনওভাবে অবদান রাখতে চান তবে দয়া করে একটি সমস্যা খুলুন বা একটি টান অনুরোধ প্রেরণ করুন।


4
খুব খারাপ যে 3 বছরেরও বেশি সময় ধরে নতুন প্রতিশ্রুতিবদ্ধ হয়নি।
মাইক লোরি

0

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

package examples;

import com.jcraft.jsch.*;
import java.io.*;
import java.util.*;

public class ScpFrom2 {

    public static void main(String[] args) throws Exception {
        Map<String,String> params = parseParams(args);
        if (params.isEmpty()) {
            System.err.println("usage: java ScpFrom2 "
                    + " user=myid password=mypwd"
                    + " host=myhost.com port=22"
                    + " encoding=<ISO-8859-1,UTF-8,...>"
                    + " \"remotefile1=/some/file.png\""
                    + " \"localfile1=file.png\""
                    + " \"remotefile2=/other/file.txt\""
                    + " \"localfile2=file.txt\""

            );
            return;
        }

        // default values
        if (params.get("port") == null)
            params.put("port", "22");
        if (params.get("encoding") == null)
            params.put("encoding", "ISO-8859-1"); //"UTF-8"

        Session session = null;
        try {
            JSch jsch=new JSch();
            session=jsch.getSession(
                    params.get("user"),  // myuserid
                    params.get("host"),  // my.server.com
                    Integer.parseInt(params.get("port")) // 22
            );
            session.setPassword( params.get("password") );
            session.setConfig("StrictHostKeyChecking", "no"); // do not prompt for server signature

            session.connect();

            // this is exec command and string reply encoding
            String encoding = params.get("encoding");

            int fileIdx=0;
            while(true) {
                fileIdx++;

                String remoteFile = params.get("remotefile"+fileIdx);
                String localFile = params.get("localfile"+fileIdx);
                if (remoteFile == null || remoteFile.equals("")
                        || localFile == null || localFile.equals("") )
                    break;

                remoteFile = filenameHack(remoteFile);
                localFile  = filenameHack(localFile);

                try {
                    downloadFile(session, remoteFile, localFile, encoding);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }

        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            try{ session.disconnect(); } catch(Exception ex){}
        }
    }

    private static void downloadFile(Session session, 
            String remoteFile, String localFile, String encoding) throws Exception {
        // send exec command: scp -p -f "/some/file.png"
        // -p = read file timestamps
        // -f = From remote to local
        String command = String.format("scp -p -f \"%s\"", remoteFile); 
        System.console().printf("send command: %s%n", command);
        Channel channel=session.openChannel("exec");
        ((ChannelExec)channel).setCommand(command.getBytes(encoding));

        // get I/O streams for remote scp
        byte[] buf=new byte[32*1024];
        OutputStream out=channel.getOutputStream();
        InputStream in=channel.getInputStream();

        channel.connect();

        buf[0]=0; out.write(buf, 0, 1); out.flush(); // send '\0'

        // reply: T<mtime> 0 <atime> 0\n
        // times are in seconds, since 1970-01-01 00:00:00 UTC 
        int c=checkAck(in);
        if(c!='T')
            throw new IOException("Invalid timestamp reply from server");

        long tsModified = -1; // millis
        for(int idx=0; ; idx++){
            in.read(buf, idx, 1);
            if(tsModified < 0 && buf[idx]==' ') {
                tsModified = Long.parseLong(new String(buf, 0, idx))*1000;
            } else if(buf[idx]=='\n') {
                break;
            }
        }

        buf[0]=0; out.write(buf, 0, 1); out.flush(); // send '\0'

        // reply: C0644 <binary length> <filename>\n
        // length is given as a text "621873" bytes
        c=checkAck(in);
        if(c!='C')
            throw new IOException("Invalid filename reply from server");

        in.read(buf, 0, 5); // read '0644 ' bytes

        long filesize=-1;
        for(int idx=0; ; idx++){
            in.read(buf, idx, 1);
            if(buf[idx]==' ') {
                filesize = Long.parseLong(new String(buf, 0, idx));
                break;
            }
        }

        // read remote filename
        String origFilename=null;
        for(int idx=0; ; idx++){
            in.read(buf, idx, 1);
            if(buf[idx]=='\n') {
                origFilename=new String(buf, 0, idx, encoding); // UTF-8, ISO-8859-1
                break;
            }
        }

        System.console().printf("size=%d, modified=%d, filename=%s%n"
                , filesize, tsModified, origFilename);

        buf[0]=0; out.write(buf, 0, 1); out.flush(); // send '\0'

        // read binary data, write to local file
        FileOutputStream fos = null;
        try {
            File file = new File(localFile);
            fos = new FileOutputStream(file);
            while(filesize > 0) {
                int read = Math.min(buf.length, (int)filesize);
                read=in.read(buf, 0, read);
                if(read < 0)
                    throw new IOException("Reading data failed");

                fos.write(buf, 0, read);
                filesize -= read;
            }
            fos.close(); // we must close file before updating timestamp
            fos = null;
            if (tsModified > 0)
                file.setLastModified(tsModified);               
        } finally {
            try{ if (fos!=null) fos.close(); } catch(Exception ex){}
        }

        if(checkAck(in) != 0)
            return;

        buf[0]=0; out.write(buf, 0, 1); out.flush(); // send '\0'
        System.out.println("Binary data read");     
    }

    private static int checkAck(InputStream in) throws IOException {
        // b may be 0 for success
        //          1 for error,
        //          2 for fatal error,
        //          -1
        int b=in.read();
        if(b==0) return b;
        else if(b==-1) return b;
        if(b==1 || b==2) {
            StringBuilder sb=new StringBuilder();
            int c;
            do {
                c=in.read();
                sb.append((char)c);
            } while(c!='\n');
            throw new IOException(sb.toString());
        }
        return b;
    }


    /**
     * Parse key=value pairs to hashmap.
     * @param args
     * @return
     */
    private static Map<String,String> parseParams(String[] args) throws Exception {
        Map<String,String> params = new HashMap<String,String>();
        for(String keyval : args) {
            int idx = keyval.indexOf('=');
            params.put(
                    keyval.substring(0, idx),
                    keyval.substring(idx+1)
            );
        }
        return params;
    }

    private static String filenameHack(String filename) {
        // It's difficult reliably pass unicode input parameters 
        // from Java dos command line.
        // This dirty hack is my very own test use case. 
        if (filename.contains("${filename1}"))
            filename = filename.replace("${filename1}", "Korilla ABC ÅÄÖ.txt");
        else if (filename.contains("${filename2}"))
            filename = filename.replace("${filename2}", "test2 ABC ÅÄÖ.txt");           
        return filename;
    }

}

আপনি কি কোনও সেশন পুনরায় ব্যবহার করতে এবং সংযোগ / সংযোগ বিচ্ছিন্ন করার ওভারহেড এড়াতে সক্ষম ছিলেন?
শ্রীধর সারনোবাত

0

উইন্ডোজ লিনাক্স বা অ্যান্ড্রয়েডে http://code.google.com/p/connectbot/ , src \ com \ trilead \ ssh2 কম্পাইল করুন, এটি লোকাল পোর্ট ফরওয়ার্ডার তৈরি করতে পারে বা ডায়নামিক পোর্ট ফরওয়ার্ডার বা অন্য কোনও তৈরি করতে পারে

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