scp через java

каков наилучший метод выполнения передачи scp через язык программирования Java? Кажется, я могу выполнить это через jsse, JSch или библиотеки Java bouncy castle. Ни одно из этих решений, по-видимому, не имеет простого ответа.

13 ответов


Я закончил с помощью Jsch- это было довольно просто, и, казалось, довольно хорошо масштабироваться (я собирала несколько тысяч файлов каждые несколько минут).


plug: sshj-единственный разумный выбор! См. эти примеры, чтобы начать работу:скачать, загрузить.


посмотреть здесь

это исходный код задачи SCP Муравьев. Код в методе "execute" - это то, где находятся гайки и болты. Это должно дать вам четкое представление о том, что требуется. Он использует JSch я считаю.

в качестве альтернативы вы также можете напрямую выполнить эту задачу Ant из своего java-кода.


я обернул Jsch некоторыми методами утилиты, чтобы сделать его немного дружелюбнее и назвал его

Jscp

здесь: https://github.com/willwarren/jscp

SCP утилита для tar папку, zip его, и 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, которые работают практически одинаково.


Это решение высокого уровня не нужно изобретать. Быстро и грязно!

1) сначала перейдите в http://ant.apache.org/bindownload.cgi и загрузите последнюю версию Apache Ant binary. (в настоящее время apache-ant-1.9.4-bin.промелькнуть.)

2) извлеките загруженный файл и найдите банку ant-jsch.Джар ("apache-ant-1.9.4 / lib / ant-jsch.сосуд.)" добавьте эту банку в свой проект. Также ant-launcher.банка и муравей.сосуд.

3) на проект Jcraft jsch SouceForge и загрузите jar. В настоящее время, jsch-0.1.52.Джар. Также добавьте эту банку в свой проект.

теперь вы можете легко использовать в java-коде классы Ant Scp для копирования файлов по сети или SSHExec для команд в SSH сервера.

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

на проект openssh перечисляет несколько альтернатив Java,TRILEAD SSH для Java Кажется, подходит то, что вы просите.


Я использую этот SFTP API, который имеет SCP под названием Zehon, это здорово, так прост в использовании с большим количеством примеров кода. Вот сайт http://www.zehon.com


Я посмотрел на многие из этих решений и многие из них мне не понравились. В основном из-за раздражающего шага, связанного с идентификацией ваших известных хостов. Это и 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("root@host:/path/on/remote");
    scp.execute();

самым большим недостатком является то, что он не находится в репозитории maven (который я мог бы найти). Но простота использования стоит того.


jsCH отлично сработал для меня. Ниже приведен пример метода, который будет подключаться к SFTP-серверу и загружать файлы в указанный каталог. Рекомендуется держаться подальше от отключения StrictHostKeyChecking. Хотя немного сложнее настроить, по соображениям безопасности указание известных хостов должно быть нормой.

jsch.setKnownHosts("C:\Users\test\known_hosts"); рекомендовано

JSch.setConfig ("StrictHostKeyChecking", "нет"); не рекомендуется

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

    }

Как и некоторые здесь, я закончил писать обертку вокруг библиотеки JSch.

Он называется way-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();

JSch-хорошая библиотека для работы. Это довольно простой ответ на ваш вопрос.

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


Я написал сервер scp, который намного проще, чем другие. Я использую проект Apache MINA (Apache SSHD) для его разработки. Вы можете посмотреть здесь:https://github.com/boomz/JSCP Также вы можете скачать файл jar из . Как пользоваться? Взгляните на: https://github.com/boomz/JSCP/blob/master/src/Main.java


Мне нужно скопировать папку рекурсивно, после попытки различных решений, наконец, в конечном итоге ProcessBuilder + expect / spawn

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