Mega Code Archive

 
Categories / Delphi / Functions
 

Remote Execute Function (Unix REXEC)

Title: Remote Execute Function (Unix REXEC) Question: This function will execute a command to a Unix box (or any TCP connection that supports REXEC - port 512) and return the display results in a file. I currently use it on HP and SUN systems. The parameters to RExec() are HostIP : string // eg. '196.11.121.160' UserID : string // eg. 'root' Password : string // eg. 'fraqu34' Command : string // eg. 'export TERM=vt100; dv' ResultFilename : string // eg. 'c:\temp\uxresult.txt' The function returns true if sucessful, else false. The command may contain multiple statements separrated by semi-colons. REMEMBER : REXEC does not run the user .profile, so NO user environments are set. You can export any environment settings in this parameter. eg. 'export TERM=vt100; export APP=baan; run_mycommand' An example of use is .... (change to directory /var and return a dir listing and return results in file c:]temp\ux.txt) procedure TForm1.Button1Click(Sender: TObject); begin RExec('196.11.121.162', 'root','passwd342', 'cd /var; ls -1', 'c:\temp\ux.txt'); Memo1.Lines.LoadFromFile('c:\temp\ux.txt'); end; Answer: uses ScktComp; function RExec(const HostIP : string; const UserID : string; const Password : string; const Command : string; const ResultFilename : string) : boolean; var TCP : TClientSocket; i : integer; TxOut : File; Buffer,Cr,Lf : byte; Failed : boolean; begin Failed := true; // Assume initial error state Cr := 13; // Carriage Return Char Lf := 10; // Line Feed Char TCP := TClientSocket.Create(nil); try TCP.Address := HostIP; TCP.ClientType := ctBlocking; TCP.Port := 512; // REXEC port TCP.Open; // Give time to connect for i := 1 to 500 do if not TCP.Active then Sleep(100) else break; // If TCP opened OK then send the command to host // and write results to specified file if TCP.Active then begin AssignFile(TxOut,ResultFileName); Rewrite(TxOut,1); TCP.Socket.SendText('0' + #0); TCP.Socket.SendText(UserID + #0); TCP.Socket.SendText(Password + #0); TCP.Socket.SendText(Command + #0); TCP.Socket.SendText(#13); Sleep(20); // Give a gap to respond // Wait for resonse from Host // You may want to check for timeout here using // a TTimer. My complete function does this, but // have omitted for sake of clarity. while (TCP.Socket.ReceiveBuf(Buffer,1) 1) do Application.ProcessMessages; // Write host byte stream to file while TCP.Socket.ReceiveBuf(Buffer,1) = 1 do begin if (Buffer = 10) then begin BlockWrite(TxOut,Cr,1); BlockWrite(TxOut,Lf,1); end else BlockWrite(TxOut,Buffer,1); end; TCP.Close; CloseFile(TxOut); Failed := false; end; finally TCP.Free; end; Result := not Failed; end;