Delphi e SSH

Delphi

22/11/2022

Bom dia pessoal, depois de muito quebrar a cara e queimar neurônio, decidi abrir um tópico sobre isso.

Preciso desenvolver algo que realize uma série de comandos SSH em alguns dispositivos, mas não sei nem por onde começar. Já tentei inúmeros tutoriais e exemplos na internet mas nenhum deu resultado. Teriam como me ajudar a realizar essa conexão e envio dos comandos?
Jean Ribeiro

Jean Ribeiro

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

22/11/2022

Isso é bem complexo.

O ideal é utilizar um componente que funcione com ssh. Do contrário, você terá que lidar com o protocolo SSH e a formatação do terminal.

Uma coisa que pode ser tentada é utilizar o PLINK. O Windows permite você executar um programa, capturando via streaming os 3 terminais: 0 - Standard Input, 1 - Standard Output e 2 - Error

É muito complexo para colocar em um único tópico.

Segue um exemplo de como executar um comando e capturar o resultado:

procedure RunDosCommand(DosApp:String; Result : TStrings);
const
  ReadBuffer = 2400;
var
  Security : TSecurityAttributes;
  ReadPipe,WritePipe : THandle;
  start : TStartUpInfo;
  ProcessInfo : TProcessInformation;
  Buffer : Pchar;
  BytesRead : DWord;
  Apprunning : DWord;
begin
  with Security do
    begin
      nlength := SizeOf(TSecurityAttributes) ;
      binherithandle := true;
      lpsecuritydescriptor := nil;
    end;
  if Createpipe (ReadPipe, WritePipe,@Security, 0)
    then
      begin
        Buffer := AllocMem(ReadBuffer + 1) ;
        FillChar(Start,Sizeof(Start),#0) ;
        start.cb := SizeOf(start) ;
        start.hStdOutput := WritePipe;
        start.hStdInput := ReadPipe;
        start.dwFlags := STARTF_USESTDHANDLES +STARTF_USESHOWWINDOW;
        start.wShowWindow := SW_HIDE;
        if CreateProcess(nil,PChar(DosApp),@Security,@Security,true,
                         NORMAL_PRIORITY_CLASS,nil,nil,start,ProcessInfo)
          then
            repeat
              Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100) ;
              Application.ProcessMessages;
              BytesRead := 0;
              ReadFile(ReadPipe,Buffer[0],ReadBuffer,BytesRead,nil) ;
              Buffer[BytesRead]:= #0;
              OemToAnsi(Buffer,Buffer) ;
              Result.Text := Result.text + String(Buffer) ;
            until (Apprunning <> WAIT_TIMEOUT) ;
        FreeMem(Buffer) ;
        CloseHandle(ProcessInfo.hProcess) ;
        CloseHandle(ProcessInfo.hThread) ;
        CloseHandle(ReadPipe) ;
        CloseHandle(WritePipe) ;
      end;
end;
GOSTEI 0
POSTAR