Вопрос-ответ

SSH library for Java [closed]

Библиотека SSH для Java [закрыта]

У кого-нибудь есть пример подключения к библиотеке SSH с использованием Java.

Переведено автоматически
Ответ 1

Java Secure Channel (JSCH) - очень популярная библиотека, используемая maven, ant и eclipse. Это открытый исходный код с лицензией в стиле BSD.

Ответ 2

Обновление: проект GSOC и код в нем не активны, но это: https://github.com/hierynomus/sshj

hierynomus взял на себя функции сопровождающего с начала 2015 года. Вот старая ссылка на Github, которая больше не поддерживается.:

https://github.com/shikhar/sshj


Был проект GSOC:

http://code.google.com/p/commons-net-ssh/

Качество кода, похоже, лучше, чем у JSch, который, хотя и является полной и рабочей реализацией, не имеет документации. На странице проекта сообщается о предстоящем бета-релизе, последний коммит в репозиторий был в середине августа.

Сравните API:

http://code.google.com/p/commons-net-ssh/

    SSHClient ssh = new SSHClient();
//ssh.useCompression();
ssh.loadKnownHosts();
ssh.connect("localhost");
try {
ssh.authPublickey(System.getProperty("user.name"));
new SCPDownloadClient(ssh).copy("ten", "/tmp");
} finally {
ssh.disconnect();
}

http://www.jcraft.com/jsch/

Session session = null;
Channel channel = null;

try {

JSch jsch = new JSch();
session = jsch.getSession(username, host, 22);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(password);
session.connect();

// exec 'scp -f rfile' remotely
String command = "scp -f " + remoteFilename;
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();

byte[] buf = new byte[1024];

// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();

while (true) {
int c = checkAck(in);
if (c != 'C') {
break;
}

// read '0644 '
in.read(buf, 0, 5);

long filesize = 0L;
while (true) {
if (in.read(buf, 0, 1) < 0) {
// error
break;
}
if (buf[0] == ' ') {
break;
}
filesize = filesize * 10L + (long) (buf[0] - '0');
}

String file = null;
for (int i = 0;; i++) {
in.read(buf, i, 1);
if (buf[i] == (byte) 0x0a) {
file = new String(buf, 0, i);
break;
}
}

// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();

// read a content of lfile
FileOutputStream fos = null;

fos = new FileOutputStream(localFilename);
int foo;
while (true) {
if (buf.length < filesize) {
foo = buf.length;
} else {
foo = (int) filesize;
}
foo = in.read(buf, 0, foo);
if (foo < 0) {
// error
break;
}
fos.write(buf, 0, foo);
filesize -= foo;
if (filesize == 0L) {
break;
}
}
fos.close();
fos = null;

if (checkAck(in) != 0) {
System.exit(0);
}

// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();

channel.disconnect();
session.disconnect();
}

} catch (JSchException jsche) {
System.err.println(jsche.getLocalizedMessage());
} catch (IOException ioe) {
System.err.println(ioe.getLocalizedMessage());
} finally {
channel.disconnect();
session.disconnect();
}

}
Ответ 3

Я только что обнаружил sshj, который, кажется, имеет гораздо более лаконичный API, чем JSCH (но для него требуется Java 6). На данный момент документация в основном состоит из примеров в репозитории, и обычно мне этого достаточно, чтобы поискать в другом месте, но мне кажется, этого достаточно, чтобы попробовать использовать в проекте, который я только начал.

Ответ 4

Взгляните на совсем недавно выпущенный SSHD, который основан на проекте Apache MINA.

java