2009. december 15., kedd
Remote Execute Function (Unix REXEC)
Problem/Question/Abstract:
Remote Execute Function (Unix REXEC)
Answer:
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 separated 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;
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;
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése