sábado, 19 de setembro de 2009

Cliente SSH com o Delphi

Algum tempo atrás eu estava a procura de um componente ou algo do tipo que me possibilitasse conectar por ssh em uma máquina remota, na época nao achei nada gratuito daí resolvi criar o meu próprio usando a biblioteca synapse, então o código fica aqui pra ajudar caso alguém se interesse:

program ssh;

{$APPTYPE CONSOLE}

uses
SysUtils, tlntsend, ssl_cryptlib;

// synapse units, cryptlib requires version 3.3.2 of Peter Gutmann's cryptlib.pas and cl32.dll

var
c : TTelnetSend;

WaitResponceTimeout, CurrentPosInLog: Integer;

//a: string;
sendbuffer: string;

begin
c := TTelnetSend.Create;

c.TargetHost := '193.73.230.111';

c.TargetPort := '22';

c.UserName := 'lordzero';
c.Password := 'mypasswordhere';

c.Timeout := 60000;

if c.SSHLogin then
begin
writeln('connected');

WaitResponceTimeout:=1000;//1 second to wait data from server
CurrentPosInLog:=1;
while True do
begin
//first receive data from server
while c.Sock.CanRead(WaitResponceTimeout) or (c.Sock.WaitingData>0) do
begin
c.Sock.RecvPacket(c.Timeout);
Sleep(1);
end;

//print received data
WriteLn('Received: ' + Copy(c.SessionLog,CurrentPosInLog,Length(c.SessionLog)));

CurrentPosInLog:=Length(c.SessionLog)+1;

//get user input
readln(sendBuffer);

//send user input to server (if any)
// .....

if (Length(sendBuffer)) > 0 then
begin
c.Send(SendBuffer +#13);
sendBuffer := '';
end;

end;

end
else
begin
writeln('could not connect');
end;

c.Logout;
c.Free;

Do que vale programação sem um exemplo feito nao é verdade?

console 514k

Este exemplo já inclui a dll da cryptlib necessária para que o source funcione

Biblioteca Synapse 763k - Site oficial: www.synapse.ararat.cz

dúvidas, correções ou sugestões? entre em contato.

15 comentários:

Mega.com Soluções em Informática disse...

ola amigo muito boa a sua dica ja faz algum tempo que tento achar um componente para fazer a conecxão ssh, felizmente ainda existem pessoas como vc parabens pelo seu trabalho, mais uma coisa baixei seu exemplo ele até abre a janela do terminal mais não conecta de maneira nenhuma tem alguma ideia do que possa ser.

Miguel Ângelo Andrade disse...

Olá Mega,

No teste que eu fiz funcionou certinho...

Colocou o IP, nome de usuário e senha.. referente ao seu servidor?

Abraços...

Mega.com Soluções em Informática disse...

Já descobri qual era o problema, era o Delphi que eu estava usando, coloquei no Delphi 6 e funcionou mais no 2009 e 2010 num teve jeito,
só mais uma duvida tem com incluir uma linha de comando pra q quando ele conecte ja envie ela?

Miguel Ângelo Andrade disse...

Com certeza...assim q estiver conectado, programe para enviar...

Mega.com Soluções em Informática disse...

No caso o comando seria este abaixo:

c.Send(comando desejado);

Miguel Ângelo Andrade disse...

faltou o #13

olha...

c.Send(SendBuffer +#13);

Mega.com Soluções em Informática disse...

no caso minha linha de comando esta assim:

c.send (/ip address add address= '+Edit1.text+'/24 interface="2 - DADOS");

onde colocaria esse sendbuffer, desculpe esta te encomodando tanto mais é que faz pouco tempo que comecei a mecher com delphi.

Miguel Ângelo Andrade disse...

sendbuffer é só uma string...

c.Send('minhastring aki' +#13);

por exemplo:

c.Send('ls' +#13);

ou ainda:

SendBuffer := 'ls';

c.Send(SendBuffer +#13);

Observação: ls = Lista os arquivos do diretório atual

Alexandre de Carli disse...

Olá Miguel, estou desenvolvendo um aplicativo que comunica-se diretamente ao SSH, enviando comandos ao mesmo, eu uso Plink, mas ele me limita um monte, seu código solucionará meus problemas.

Só tem um problema. Meu delphi é o RAD Studio XE e não tem: tlntsend, ssl_cryptlib para colocar no uses...

Existe alguma unit parecida que eu possa usar para substituir?

Obrigado!

Miguel Ângelo Andrade disse...

Olá Alexandre!

essas units sao da biblioteca synapse...

olhe no site oficial:

http://www.synapse.ararat.cz/doku.php/download

pro dia de hoje 10/01/2011 o site diz q a biblioteca possui suporte pras seguintes versoes:

■Delphi 3-7, Delphi 2005-2007, C++Builder, Kylix 1-3 or FreePascal 2.x.x
■experimental Delphi.NET (Delphi 8+)
■experimental Delphi 2009+


mas nao custa nada testar no Delphi XE pra ver se funciona!

abraços!!!

Daniel disse...

Olá, preciso criar uma conexão SSH em Delphi que execute um programa no servidor feito em Harbour, o mais próximo que cheguei foi com seu exemplo, o problema é que retorna um monte de caracteres estranhos. Já tentei usar UTF8Decode e várias outras coisas, inclusive fazer uma conversão via software mas nada dá certo. Vc não teria uma solução para isso? Grato Daniel

Rodrigo Hubner disse...

Bacana Daniel.. Valeu pela dica...

Valmir Gomes disse...

O meu nao esta conectando, tenho que mudar algo ?

Miguel A. disse...

Olá Daniel, não conheço muito bem Harbour, talvez você pode tentar entrar em contato com o desenvolvedor da biblioteca para verificar se o mesmo pode ajudar em algo.

Miguel A. disse...

Olá Valmir, é necessário trocar o IP, nome de usuário e senha.