Functions Delphi

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;