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.

10 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!!!