Каков наилучший способ выполнения передачи scp через язык программирования Java? Кажется, я смогу выполнить это через JSSE, JSch или java-библиотеки bouncy jown. Ни у одного из этих решений нет простого ответа.scp через java
ответ
Я закончил с использованием Jsch - это было довольно просто, и, казалось, очень хорошо масштабировалось (я хватал несколько тысяч файлов каждые несколько минут).
jsch оказался лучшей альтернативой, но документация ужасна. Совет от Abarax, чтобы посмотреть на задачу муравьев scp, был очень полезен. Это действительно не ясно, если проект по-прежнему очень активен. Спасибо за совет. – 2008-10-19 01:11:52
@LloydMeinholz: Я написал [Javadocs] (http://epaul.github.com/jsch-documentation/simple.javadoc/) для этой библиотеки. – 2011-11-01 11:45:55
Paulo- замечательная работа! Они выглядят очень полезными. – 2011-11-08 21:56:01
В списке openssh project перечислены несколько альтернатив Java, Trilead SSH for Java, похоже, соответствует тем, о чем вы просите.
Trilead кажется намного более зрелым, чем Jsch, но ему не хватало поддержки sftp и scp, и это то, чем я был.В настоящее время sftp поддерживает только get и put (мне также нужны ls и rm), а поддержка scp была указана как экспериментальная. – 2008-10-19 01:13:31
Посмотри here
То есть исходный код для SCP задачи Муравьев. Код в методе «выполнить» - это гайки и болты. Это должно дать вам представление о том, что требуется. Он использует JSch, я верю.
В качестве альтернативы вы также можете выполнить эту задачу Ant непосредственно из своего java-кода.
Я использую этот API SFTP, который имеет SCP под названием Zehon, он замечательный, настолько прост в использовании с большим количеством примеров кода. Вот сайт http://www.zehon.com
Я завернул 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, которые работают в значительной степени тем же способом.
Я написал scp-сервер, который намного проще других. Я использую проект Apache MINA (Apache SSHD) для его разработки. Вы можете посмотреть здесь: https://github.com/boomz/JSCP Также вы можете загрузить файл jar из каталога /jar
. Как использовать? Посмотрите на: https://github.com/boomz/JSCP/blob/master/src/Main.java
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.
Я нашел библиотеку, которая не требует этого, но в комплекте и используется как инструмент командной строки.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 репо (что я мог найти). Но простота использования мне того стоит.
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.
Это называется путь-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();
Это не решение высокого уровня, нет необходимости заново. Быстро и грязно!
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();
Мне нужно скопировать папку рекурсивно, после попытки различные решения, в конечном итоге в конечном итоге на 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();
}
- 1. Файл сервера через scp
- 2. Скопировать файл через scp
- 3. scp через промежуточные хосты
- 4. Загрузить через SCP с Gradle
- 5. SCP через внутренние устройства SSH
- 6. ant scp task через прокси
- 7. Отправка файла через ssh2, scp
- 8. Scp через туннель ssh открыт
- 9. scp копирование с жесткого диска через сервер
- 10. Разрешение отклонено при попытке scp через код
- 11. не удалось отправить файлы через scp
- 12. SCP Через python не передается файл
- 13. Разверните zipped EAR до Wildfly через scp
- 14. Как читать файл через ssh/scp напрямую
- 15. Scp с сервера, доступного через другой сервер
- 16. Передача файла через SCP с веб-страницы
- 17. Загрузка файла через SCP с ошибкой Maven
- 18. Что быстрее? Копировать через nfs-mount или через scp?
- 19. Преимущества NET :: SCP по системе «scp ...» или exec «scp ...»
- 20. Проблемы с блокировкой файлов - Синхронизация через клиента SCP
- 21. Java среда Exec с помощью команды Scp
- 22. scp между двумя терминальными окнами (или multihop scp)
- 23. Неинтерактивный scp
- 24. Scp как фоновая работа?
- 25. Jenkins и SCP
- 26. Как scp в python?
- 27. развертывание java через Cygwin
- 28. Отправка пароля через SSH или SCP с подпроцессом.Popen
- 29. Скопируйте файлы из папки WWW на внешний сервер через SCP
- 30. Disallow SCP fallback через API сборки WinSCP .NET
вы можете сломать проблемы, которые у вас есть с различными библиотеками, почему они не работают для вас? – 2008-10-14 01:23:40