scp через java
-
11-07-2019 - |
Вопрос
Каков наилучший метод выполнения передачи scp с помощью языка программирования Java?Кажется, я смогу выполнить это с помощью JSSE, JSch или java-библиотек bouncy castle.Ни одно из этих решений, похоже, не имеет простого ответа.
Решение
Я закончил тем, что использовал Jsch - это было довольно просто и, похоже, хорошо масштабировалось ( Я брал несколько тысяч файлов каждые несколько минут).
Другие советы
Я обернул Jsch некоторыми служебными методами, чтобы сделать его немного более дружественным, и вызвал его
Jscp ( АО )
Доступно здесь: https://github.com/willwarren/jscp
Утилита SCP для создания tar папки, заархивирования ее и 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. (в настоящее время 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();
В проекте openssh перечислено несколько вариантов Java, Trilead SSH для Java , кажется, соответствует вашим запросам.
Я использую этот SFTP API с SCP под названием Zehon, он великолепен, поэтому его легко использовать с большим количеством примеров кода. Вот сайт http://www.zehon.com
Я посмотрел на многие из этих решений, но многие из них мне не понравились. Главным образом потому, что раздражает необходимость идентифицировать ваших известных хостов. Это и JSCH находится на смехотворно низком уровне относительно команды scp. Р>
Я нашел библиотеку, которая не требует этого, но она собрана и используется в качестве инструмента командной строки. https://code.google.com/p/scp-java-client/а> р>
Я просмотрел исходный код и обнаружил, как его использовать без командной строки. Вот пример загрузки: Самым большим недостатком является то, что он не в репозитории Maven (что я мог найти). Но простота использования того стоит. 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();
Как некоторые здесь, я написал оболочку для библиотеки 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();
Я написал scp-сервер, который намного проще, чем другие. Я использую проект Apache MINA (Apache SSHD) для его разработки. Вы можете посмотреть здесь: https://github.com/boomz/JSCP
Также вы можете скачать файл jar из каталога / jar
.
Как пользоваться? Посмотрите на: https://github.com/boomz/JSCP/ блоб / ведущий / SRC / Main.java р>
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();
}
}
}
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. ком / 2013/09 / Java-загрузка-файлы удалены через-scp.html
Мне нужно рекурсивно копировать папку, после того, как я попробовал разные решения, в итоге получаю 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();
}