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.

22 comentários:

WGS 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 A. 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...

WGS 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 A. disse...

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

WGS disse...

No caso o comando seria este abaixo:

c.Send(comando desejado);

Miguel A. disse...

faltou o #13

olha...

c.Send(SendBuffer +#13);

WGS 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 A. 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 A. 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

Com investimentos de mais de R$ 940 milhões, Governo Federal fomenta melhorias dos serviços de saneamento básico pelo Brasil disse...

Bacana Daniel.. Valeu pela dica...

Unknown 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.

Miguel disse...

uma Sugestão só que no caso é uma biblioteca comercial seria a Eldos

Anônimo disse...

Seguinte,

Tentei no Delphi 2010.
Acessei a documentação dele e vi que é necessário baixar as bibliotecas OpenSSL e definir que está usando implementação OpenSSL.

Baixei a versão da trunk.

Fiz isso, porém, retorna erro e não conecta.

Lucas disse...

Alguém fez isso funcionar com delphi 2010?

Escafoide disse...

parabéns pelo post.. 8 anos depois e ainda funciona

Mabreu disse...

Opa tem com ajudar a rodar no Delphi Tokyo:

function GetTimeFromStr(Value: string): TDateTime;
var
x: integer;
begin
x := rpos(':', Value);
if (x > 0) and ((Length(Value) - x) > 2) then
Value := Copy(Value, 1, x + 2);
Value := ReplaceString(Value, ':', TimeSeparator);
Result := -1;
try
Result := StrToTime(Value);
except
on Exception do ;
end;
end;

Dá que esse TimeSeparator não foi declarado

Anônimo disse...

Mabreu,

Declarou a SysUtils nas uses?

http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.SysUtils.TFormatSettings.TimeSeparator

Rafael disse...

Avante guerreiro!