Ssh em java{resolvido}

22 respostas
G

Boa tarde,
Gostaria de uma ajuda para usar o ssh no java, por exemplo a biblioteca nao sei qual que é eu baixei algumas mas nao ta dando certo, e gostaria de saber como q eu faço a conexao se alguem puder me ajudar, quero me conectar a um servidor linux/unix
obrigado

22 Respostas

N

eu sempre usei a biblioteca http://www.ganymed.ethz.ch/ssh2/

ela vem com varios exemplos… bem facil…

G

Poxa eu to tentando me conecta aqui mas nao estou conseguindo o que estou fazendo de errado?

String hostname = "192.168.0.1";
	String username = "teste";
	String password = "pass";
		
	Connection conn = new Connection(hostname);
        conn.connect();
        conn.authenticateWithPassword(username, password);
N

Se o seu servidor ssh estiver online e seu usuario e senha estiverem corretos os comandos a seguir devem funcionar

String hostname = "192.168.0.1";  
String username = "teste";  
String password = "pass";  
          
Connection conn = new Connection(hostname);  
conn.connect();  
if (conn.authenticateWithPassword(username, password)){
    //autenticou
    conn.openSession();
    conn.execCommand("ls -l");
    conn.close;
}
tubiluki

Já usei o jsch… nao tem mta documentação e é meio complicado de usar… mas seguindo normalmente dá para fazer o que precisa…

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

G
Bem nao consigo fazer funcionar alguem pode me ajudar. estou usando o seguinte codigo
String hostname = "192.168.0.93";
        String username = "teste";
        String password = "teste";

        Connection conn = new Connection(hostname);
        conn.connect();
        if (conn.authenticateWithPassword(username, password)){
             System.out.println("entrou");
             conn.openSession();
             conn.close();
        }
N

mas qual erro tá dando? coloca a excessao ai

G

Exception in thread "main" java.io.IOException: There was a problem while connecting to 192.168.0.1:22 at ch.ethz.ssh2.Connection.connect(Connection.java:699) at ch.ethz.ssh2.Connection.connect(Connection.java:490) at linux.Conexao.getConexao(Conexao.java:15) at linux.Main.main(Main.java:12) Caused by: java.net.ConnectException: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:519) at ch.ethz.ssh2.transport.TransportManager.establishConnection(TransportManager.java:340) at ch.ethz.ssh2.transport.TransportManager.initialize(TransportManager.java:448) at ch.ethz.ssh2.Connection.connect(Connection.java:643) ... 3 more Java Result: 1 CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

N

caraa… na hora da conexão o java não está conseguindo encontrar seu host …

no terminal do linux vc consegue a conexão com esses dados mesmo? é esse ip mesmo?
a porta do ssh é a 22?

G

eh sim cara =(
mas o sintaxe esta toda certa?
tem como trocar a porta de acesso por comando java

N

o java esta tentando a conexao com esse dados : 192.168.0.1 na porta 22
da um conferida ai… no seu codigo o ip do host tá diferente

N

A sintaxe tá certinha… o código é esse mesmo …

se tá tudo certo com seus dados de conexao … entao pode ser alguma configuração no seu servidor SSH que esta bloqueando esse tipo de conexao.

G

eu sei ta certo estou tentando conectar em uma vm

N

vc pode tentar reiniciar o servidor ssh … as vezes isso dá certo

G
Vou mandar todo meu programa
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class Main {
    public static void main(String[] args) throws IOException {
    Conexao c = new Conexao();
    c.getConexao();
    System.out.println("conexaofeita");
    File file = new File("/etc/passwd");
    FileInputStream fi = new FileInputStream(file);

    Scanner scan = new Scanner(fi);
    String str = JOptionPane.showInputDialog("Usuario");
    String readLine="";
    String conteudo = "";
    while (scan.hasNext()) {
           readLine = scan.next();
           if(readLine.contains(str)){
                    conteudo += "#"+readLine+"\r\n";
           }
           else
               conteudo+=readLine+"\r\n";
    }
    fi.close();
    FileOutputStream fo = new FileOutputStream(file,false);
    fo.write(conteudo.getBytes());
    fo.close();
    }
}
import ch.ethz.ssh2.Connection;
import java.io.IOException;


public class Conexao
{
public Connection getConexao() throws IOException{

	String hostname = "192.168.0.93";
        String username = "md2";
        String password = "md2net";

        Connection conn = new Connection(hostname);
        conn.connect();
        if (conn.authenticateWithPassword(username, password)){
             System.out.println("entrou");
             conn.openSession();
             
        }
        return conn;
}

}
N

aiiii … rodei seu codigo aqui… conectou certinhoooo…

acho que seu problema é a VM … mas ai já não entendo muito…
mas por não estar encontrando o host de conexão a VM não deve estar configurada na mesma rede que vc …
mas seu codigo de conexao do ssh tá certo… rodei e testei aqui

G

velhoo muito obrigado se voce puder fazer mais um teste pra mim eu ficaria muito agradecido.
criar um usuario no linux e digitar o nome dele para ver se meu programa vai comentar a linha e assim bloquear o usuario

N

não testei, mas só de olhar deu pra perceber que não vai da certo…

se quiser mecher na maquina linux vai ter usar os comandos unix dentro da sessao do ssh depois do : conn.openSession();

vc pode usar o conn.execCommand(“cd \etc\passwd”);

o comando File file = new File("/etc/passwd"); vai criar um arquivo na sua maquina e não no linux…

para trocar arquivos entre as maquinas vc pode usar o ftp …

espero ter ajudado !!

G

ninjasauro:
não testei, mas só de olhar deu pra perceber que não vai da certo…

se quiser mecher na maquina linux vai ter usar os comandos unix dentro da sessao do ssh depois do : conn.openSession();

vc pode usar o conn.execCommand(“cd \etc\passwd”);

o comando File file = new File("/etc/passwd"); vai criar um arquivo na sua maquina e não no linux…

para trocar arquivos entre as maquinas vc pode usar o ftp …

espero ter ajudado !!

Vc ajudou muito, mais um pergunta eu quero por exemplo listar os usuarios do linux e comentar as linhas daqueles que eu digitar, como vou fazer?

ctdaa

Tem certeza que você precisa fazer isto pelo java? Me parece que esta tarefa é uma responsabilidade do administrador do linux…
Mas a sugestão que posso deixar é a seguinte: faça parte da sua programação em shell linux e use seu programa java para disparar estas rotinas.

G

Infelzmente eu tenho certeza que tenho que fazer isso.
mas quando um merda de um administrador linux num faz as coisas direito entramos neh -.-

olha eu to avançando no seguinte se alguem puder me dar uma ideia, pois terei que tratar toda a string em memoria.
if (conn.authenticateWithPassword(username, password)){
             System.out.println("entrou");
             Session session = conn.openSession();
             session.execCommand("cat /etc/passwd");
             String str = JOptionPane.showInputDialog("Usuario");
             int b;
             String c="";
             String conteudo="";
             while((b = session.getStdout().read()) != -1){
                c += (char) b;
               
             }
             System.out.println(c);
             while(c.){//o problema ta aqui eu sei que é ridiculo mas como vou
                 //a leitura de toda a string?
              if(c.contains(str)){
                    conteudo += "#"+c;
                }
                 else
                 conteudo+= c;
                }
             //session.execCommand("echo"+"\""+ conteudo+"\""+" > /etc/passwd");

        
             System.out.println(conteudo);
N

talvez essa tarefa sua possa ser feita em java mesmo, mas talvez não pelo ssh … eu sinceramente não sei fazer tudo isso apenas pelo ssh.
talvez vc possa criar uns shellscripts e dispara pelo java como o colega falou ou sei lá… pega o arquivo via ftp edita e envia no pro linux novamente … sei que é tosco mas é apenas uma idéia.

G
Bem galera ai ta o programa feito pra futuras duvidas
Connection conn = new Connection(hostname);
        conn.connect();
        if (conn.authenticateWithPassword(username, password)){
             System.out.println("entrou");
             Session session = conn.openSession();
             session.execCommand("cat /etc/passwd");
             String str = JOptionPane.showInputDialog("Usuario");
             int b;
             String c="";
             String conteudo="";
             while((b = session.getStdout().read()) != -1){
                c += (char) b;               
             }
             System.out.println(c);
             Session s2 = conn.openSession();
             String d = c;
             Scanner scan = new Scanner(c);
             String espaco = " ";

             while (scan.hasNext()) {
                 c = scan.nextLine();
              if(c.contains(str)){
                    conteudo += "#"+c+"\n";
                    //session.execCommand("echo"+"\""+ conteudo+"\""+" > /etc/passwd");
                }
                 else{
                   conteudo+= c+"\n";
                 
                // session.execCommand("echo"+"\""+conteudo+"\""+" > /etc/passwd");
             }
             }
             s2.execCommand("echo "+"\""+conteudo+"\""+" > /etc/passwd");
             System.out.println(conteudo);
Criado 14 de setembro de 2009
Ultima resposta 15 de set. de 2009
Respostas 22
Participantes 4