scp через java - PullRequest
       118

scp через java

70 голосов
/ 14 октября 2008

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

Ответы [ 13 ]

51 голосов
/ 14 октября 2008

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

19 голосов
/ 09 марта 2010

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

16 голосов
/ 14 октября 2008

Взгляните здесь

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

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

6 голосов
/ 26 декабря 2012

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

Jscp

Доступно здесь: https://github.com/willwarren/jscp

Утилита 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, которые работают примерно так же.

4 голосов
/ 05 апреля 2015

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

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

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

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

Теперь вы можете легко использовать в коде 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();
2 голосов
/ 24 октября 2013

Я посмотрел на многие из этих решений и мне не понравились многие из них. Главным образом потому, что раздражает необходимость идентифицировать ваших известных хостов. Это и 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 (что я мог найти). Но простота использования этого стоит для меня.

2 голосов
/ 18 июня 2009

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

2 голосов
/ 14 октября 2008

В проекте openssh перечислено несколько альтернатив Java, Trilead SSH для Java , кажется, соответствует вашим запросам.

1 голос
/ 08 января 2014

Как некоторые здесь, я закончил писать обертку вокруг библиотеки 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();
0 голосов
/ 19 января 2018

Мне нужно рекурсивно копировать папку, после попытки разных решений, в итоге получаю ProcessBuilder + ожидаем / 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();
}
...