Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
JSch
uma biblioteca Java para
facilitar o uso do SSH
Executando comandos remotos e fazendo
conexão SSH dentro de programas Java
Durante a leitura do artigo iremos ver como a biblioteca
JSch pode facilitar o uso do protocolo SSH. Várias tare-
fas relacionadas ao uso do protocolo podem ser executa-
das facilmente através de programas Java usando esta bi-
blioteca.
/ 48
porado a produtos proprietários. Algumas aplicações » criar um objeto JSch – onde ficam as configu-
que usam o JSch são: ANT, Eclipse, Netbeans, Maven, rações básicas como usuário e senha para a
JiRA, entre outras. conexão
Além do JSch temos outras bibliotecas criadas » criar uma sessão – a sessão deve ser recupera-
pela mesma empresa que são: da do objeto JSch
» WiredX e WeirdX – X Window Systems – um » conectar a sessão no host remoto passando as
X Window System é um programa e um pro- credenciais do usuário
tocolo de rede que prove uma interface gráfica » abrir um canal no host remoto de um deter-
GUI para administração remota de servidores minado tipo usando a sessão aberta no passo
(o primeiro é comercial, o segundo usa licença anterior
GPL) » executar os comandos desejados no canal
» JZlib – implementação em Java da biblioteca aberto com o host remoto
Zlib de compressão de arquivos » fechar o canal
» JCTerm – um emulador de terminal escrito em » fechar a sessão com o host
Java para o protocolo SSH A seguir, temos a implementação destes passos
» JOrbis – implementação em Java para traba- através de código Java.
lhar com compressão de arquivos de áudio
» JHttpTunnel – implementação em Java de um Listagem 1. Primeiro exemplo usando a biblioteca
Túnel HTTP JSch.
» JRexec – um cliente REXEC escrito em Java
/* As configurações da sessão são feitas no objeto jSch */
Este artigo está focado apenas na utilização da JSch jSch = new JSch();
biblioteca JSch. Mais detalhes dos outros projetos int port = 22;
podem ser encontrados no site da empresa (consul- String host = “localhost”;
tar referências). String username = “andre.fonseca”;
Session session = jSch.getSession(username, host, port);
Iniciando com o JSch, criando o session.setPassword(“pass”);
primeiro exemplo /*
No momento da escrita deste artigo a última * Conecta ao host sem pedir confirmação caso contrário
versão da biblioteca era a 0.1.4.9. No site do projeto * você pode adicionar a lista de hosts conhecidos
pode ser feito o download do JAR apenas ou então * usando o método setKnowHosts da classe JSch. Em
do arquivo ZiP o qual contém vários exemplos que * ambiente Linux recebe como parametro uma string
* que aponta para o arquivo home/foo/.ssh/known_hosts
podem ser testados através do ANT.
*/
Após o download crie um novo projeto Java na Properties config = new Properties();
sua iDE de preferência e adicione o JAR do JSch no config.put(“StrictHostKeyChecking”, “no”);
CLASSPATH da aplicação, no meu caso estou usando session.setConfig(config);
o Eclipse. /* Conecta a sessão usando um timeout */
Para realizar uma conexão SSH com o host re- session.connect(3000);
moto (servidor) os seguintes passos precisam ser
seguidos: /*
49 \
* Abre um canal com a sessão do tipo shell
* para alterar o tipo altere o parâmetro do método
*/
Channel channel = session.openChannel(“shell”);
/* agora eu posso realizar as operações necessárias no
servidor remoto */
/* Desconecta do canal */
channel.disconnect();
/* Desconecta da sessão */
session.disconnect();
/ 50
Como não estamos armazenando a chave de au-
// conecta no canal
tenticação no nosso computador toda vez que conec- channel.connect();
tarmos no servidor “localhost” (serviço sshd rodando // imprime no console do Eclipse o resultado do comando
no Cygwin) iremos receber a mensagem abaixo. Em executado
ambientes Linux esta chave é armazenada no arquivo byte[] tmp=new byte[1024];
~/.ssh/known_hosts. Clique em “Yes” para continuar. while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)break;
51 \
Channel channel = session.openChannel(“exec”);
((ChannelExec) channel).setCommand(command); I INFO: SSH_MSG_SERVICE_REQUEST sent
// recupera as streams de entrada/saida do scp remoto
INFO: SSH_MSG_SERVICE_ACCEPT received
OutputStream out = channel.getOutputStream();
InputStream in = channel.getInputStream(); INFO: Authentications that can continue: publickey,keyboard-
interactive,password
// envia o comando “C0644 tamanho_arquivo nome_ INFO: Next authentication method: publickey
arquivo”, onde o nome_arquivo INFO: Authentications that can continue: keyboard-
// não deve possuir ‘/’ interactive,password
long filesize = _lfile.length();
INFO: Next authentication method: keyboard-interactive
command = “C0644 “ + filesize + “ “;
if (lfile.lastIndexOf(‘/’) > 0) { INFO: Authentications that can continue: password
command += lfile.substring(lfile.lastIndexOf(‘/’) + 1); INFO: Next authentication method: password
} else { INFO: Authentication succeeded (password).
command += lfile;
}
command += “\n”;
out.write(command.getBytes()); Listagem 6. Criando um Logger para exibir as infor-
out.flush(); mações da conexão SSH com o servidor.
// envia o conteudo do arquivo para o servidor remoto // seta um logger personalizado
fis = new FileInputStream(lfile); JSch.setLogger(new MyLogger());
byte[] buf = new byte[1024];
while (true) { // define uma classe estatica para implementação
int len = fis.read(buf, 0, buf.length); de um logger
if (len <= 0) // personalizado
break; public static class MyLogger implements
out.write(buf, 0, len); // out.flush(); com.jcraft.jsch.Logger {
} static java.util.Hashtable name=
fis.close(); new java.util.Hashtable();
fis = null; static{
// send ‘\0’ name.put(new Integer(DEBUG), “DEBUG: “);
buf[0] = 0; name.put(new Integer(INFO), “INFO: “);
out.write(buf, 0, 1); name.put(new Integer(WARN), “WARN: “);
out.flush(); name.put(new Integer(ERROR), “ERROR: “);
out.close(); name.put(new Integer(FATAL), “FATAL: “);
}
public boolean isEnabled(int level){
Logger.java return true;
Este exemplo mostra como criar um logger para }
public void log(int level, String message){
recuperar as informações durante a conexão com o
System.err.print(name.get(new Integer(level)));
servidor. System.err.println(message);
}
Listagem 5. Listando informações da conexão SSH
}
com o servidor no console do Eclipse.
/ 52
display digitando o seguinte comando export DIS-
PLAY=’127.0.0.1:0’ no Console do Eclipse.
Agora você pode iniciar uma aplicação “GUi” di-
retamente pelo console do Eclipse, tente, por exem-
plo, rodando xlogo.exe & ou xclock.exe & no console.
Figura 9. Iniciando o Cygwin/XServer. Podemos utilizar essa biblioteca dentro dos nossos
programas Java para facilitar a comunicação com ser-
vidores remotos através do protocolo SSH. Várias ta-
Listagem 7. Definindo as configurações para fazer o
refas podem ser executadas como: execução remota
X11 Forwarding.
de comandos, SCP, SFTP, X11 Forwarding etc.
String xhost=”127.0.0.1”; Essas funcionalidades podem ser integradas fa-
int xport=0;
cilmente com outros programas já existentes facili-
// define as propriedades xhost e xport
tando a automatização de tarefas repetitivas, como
// necessárias para fazer o X11 Forwarding backup, transferência de arquivos, entre outras.
session.setx11Host(xhost);
session.setX11Port(xport+6000); /referências
Channel channel=session.openChannel(“shell”); > Site do JCraft (contendo todos os projetos inclusive a
biblioteca JSch): http://www.jcraft.com/
channel.setXForwarding(true);
> Download do JAR do JSch : http://sourceforge.net/
53 \