scp通过java

通过Java编程语言执行scp传输的最佳方法是什么? 看来我可以通过JSSE,JSch或弹性城堡Java库来执行此操作。 这些解决scheme似乎都没有一个简单的答案。

我结束了使用Jsch – 这是非常简单的,似乎扩展得相当好(我每隔几分钟抓几千个文件)。

看看这里

这是ant的SCP任务的源代码。 “execute”方法中的代码就是其中的细节和部分。 这应该给你一个公平的想法是什么要求。 它使用JS我相信。

另外,你也可以直接从你的java代码中执行这个Ant任务。

插件:sshj是唯一的理智的select! 看到这些例子开始: 下载 , 上传 。

我用一些实用的方法包装了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,其工作方式几乎相同。

这是高层次的解决scheme ,不需要重新创build。 快又脏!

1)首先到http://ant.apache.org/bindownload.cgi下载最新的Apache Ant二进制文件。 (时下,apache-ant-1.9.4-bin.zip)。

2)提取下载的文件并findJAR ant-jsch.jar (“apache-ant-1.9.4 / lib / ant-jsch.jar”)。 在你的项目中添加这个JAR 。 还有ant-launcher.jar和ant.jar。

3)去Jcraft jsch SouceForge项目并下载jar。 现在, jsch-0.1.52.jar 。 还要在你的项目中添加这个JAR

现在,你可以很容易地使用Java代码的Ant类Scp复制文件通过networking或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的替代品, 用于Java的Trilead SSH似乎符合你的要求。

我使用这个名为Zehon的SCP的SFTP API,它很棒,很容易使用大量的示例代码。 这是网站http://www.zehon.com

我看了很多这些解决scheme,并不喜欢其中的很多。 主要是因为不得不确定你已知的主机的恼人的一步。 这和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回购(我可以find)。 但是,易用性对我来说是值得的。

jsch对我很好。 下面是一个连接到sftp服务器并将文件下载到指定目录的方法示例。 build议远离禁用StrictHostKeyChecking。 虽然设置起来有点困难,但出于安全原因,指定已知主机应该是常态。

jsch.setKnownHosts( “C:\ Users \用户testing\ known_hosts中”); 推荐的

JSch.setConfig(“StrictHostKeyChecking”,“no”); – 不build议

 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,它被托pipe在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); } } 

你可以在这里find完整的代码

http://faisalbhagat.blogspot.com/2013/09/java-uploading-file-remotely-via-scp.html

edtFTPj / PRO支持SCP传输(以及SFTP,FTP和FTPS)。

我写了一个比其他人更容易的scp服务器。 我使用Apache MINA项目(Apache SSHD)来开发它。 你可以看看这里: https : //github.com/boomz/JSCP你也可以从/jar目录下载jar文件。 如何使用? 看看: https : //github.com/boomz/JSCP/blob/master/src/Main.java

Interesting Posts