13 ответов:
Я в конечном итоге с помощью Jsch- это было довольно просто, и, казалось, масштабируется довольно хорошо (я хватал несколько тысяч файлов каждые несколько минут).
посмотреть здесь
, который является исходным кодом для задач муравьи' УПП. Код в методе "execute" находится там, где находятся гайки и болты. Это должно дать вам четкое представление о том, что требуется. Он использует JSch я считаю.
в качестве альтернативы вы также можете напрямую выполнить эту задачу Ant из вашего кода java.
я обернул Jsch с некоторыми служебными методами, чтобы сделать его немного дружелюбнее и назвал его
программ
здесь: 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.сосуд.)" добавьте эту банку в свой проект. Также муравьиная пусковая установка.банка и муравей.сосуд.
3) на Jcraft jsch SouceForge Project и загрузите 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();
The проект 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(); }
Comments