2008-10-14 2 views
66

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

+2

вы можете сломать проблемы, которые у вас есть с различными библиотеками, почему они не работают для вас? – 2008-10-14 01:23:40

ответ

50

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

+0

jsch оказался лучшей альтернативой, но документация ужасна. Совет от Abarax, чтобы посмотреть на задачу муравьев scp, был очень полезен. Это действительно не ясно, если проект по-прежнему очень активен. Спасибо за совет. – 2008-10-19 01:11:52

+23

@LloydMeinholz: Я написал [Javadocs] (http://epaul.github.com/jsch-documentation/simple.javadoc/) для этой библиотеки. – 2011-11-01 11:45:55

+0

Paulo- замечательная работа! Они выглядят очень полезными. – 2011-11-08 21:56:01

2

В списке openssh project перечислены несколько альтернатив Java, Trilead SSH for Java, похоже, соответствует тем, о чем вы просите.

+0

Trilead кажется намного более зрелым, чем Jsch, но ему не хватало поддержки sftp и scp, и это то, чем я был.В настоящее время sftp поддерживает только get и put (мне также нужны ls и rm), а поддержка scp была указана как экспериментальная. – 2008-10-19 01:13:31

16

Посмотри here

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

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

2

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

17

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

5

Я завернул 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") 
      ); 

включает также полезные классы - УПП и EXEC, и TarAndGzip, которые работают в значительной степени тем же способом.

0

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

1

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

2

Я посмотрел на многие из этих решений и не нравятся многие из них. В основном из-за раздражающего шага, чтобы определить ваши известные хосты. Это и АОХ находится на смехотворно низком уровне относительно команды 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(); 

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

1

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

jsch.setKnownHosts ("C: \ Users \ 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. (в настоящее время, apache-ant.1.9.4-bin.zip).

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

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

Теперь вы можете easyly использовать в Java коде муравей Классы 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(); 
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(); 
} 
Смежные вопросы