Delphi e SSH

22/11/2022

0

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

Responder

Posts

23/12/2022

Arthur Heinrich

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;
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar