Запуск команди на Linux-сервері з Delphi

Можливо це питання не зовсім на тему конференції, але дуже хотілося б знати як з дельфової програми, що виконується під Win 2K, виконати програму на комп'ютері, що працює під управлінням Червоної Шапочки. (Програма, зрозуміло, Лінуксова). Як перетворити Win2K-ний комп'ютер на консоль Лінуксової машини мій колега-сисадмін знає (за допомогою клієнтської частини та якогось SSH). Але як це зробити не ручками, а з програми? Вибачте, якщо не в тему

Шукай в мережі XWindow for windows і/або SSH для Дельфі, можна взяти тільки специфікації і самому наваять, але це досить складно

По мінімуму - шукати компонент, що релізує протокол telnet, якщо потрібно шифрування - компонент, що реалізує ssh/ssh2 (не зустрічав таких делфевих, ризикни пошукати фріварні COM-компоненти) або використовувати зв'язок telnet + stunnel (http://www.stunnel.org/ ).

Telnet реалізують більш-менш прямо компоненти Indy (здається, починаючи ще з WinShoes)

Title: Remote Execute Function (Unix REXEC) Autor: Mike Heydon Product: Delphi 5.x (або higher) Post Date: 10/23/2002

Remote Execute Function (Unix REXEC)

Ця функція буде execute command to Unix box (або any TCP connection that supports REXEC - port 512) and return the display results in a file. I currently use it on HP і 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"

Function returns true if sucessful, else false.

eg. "export TERM=vt100; export APP=baan; run_mycommand"

An example of use is . (змінити directory /var andповернути список каталогу та повернути результати у файлі c:\temp\ux.txt)

процедура TForm1.Button1Click(Відправник: TObject); begin RExec("196.11.121.162", "root", "passwd342", "cd /var; ls -1", "c:\temp\ux. txt");

функція RExec(const HostIP: рядок; const UserID: рядок; const Пароль: рядок; const Команда: рядок; const ResultFilename: рядок): логічний; вар. TCP: TClientSocket; i: ціле число; TxOut: файл; Буфер, Cr, Lf: байт; Помилка: логічний; begin Failed := true; // Припустимо початковий стан помилки Cr := 13; // Повернення каретки Char Lf := 10; // Символ переходу рядка TCP := TClientSocket.Create(nil);

спробуйте TCP.Address := HostIP; TCP.ClientType := ctBlocking; TCP.Порт := 512; // порт REXEC TCP.Open;

// Дайте час підключитися for i := 1 to 500 do if not TCP.Active then Sleep(100) else break;

// Якщо TCP відкрився нормально, тоді надішліть команду на хост // і запишіть результати у вказаний файл if TCP.Active then begin AssignFile(TxOut, ResultFileName); Переписати (TxOut, 1); TCP.Socket.SendText("0" + #0); TCP.Socket.SendText(UserID + #0); TCP.Socket.SendText(Пароль + #0); TCP.Socket.SendText(Command + #0); TCP.Socket.SendText(#13); Сон (20); // Дати проміжок для відповіді

// Записати потік байтів хоста у файл 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); кінець;

TCP.Close; Закрити файл (TxOut); Помилка := false; кінець; нарешті TCP.Free; кінець;

Величезне спасибі за відповіді. На жаль, наш сисадмін не бажає встановлювати на стороні сервера ні підтримку телнета, ні підтримку REXEC (бачимо, із-за міркувань безпеки). Сам він працює через небезкоштовну (!) примочку, що використовує SSH. Він пропонує написати серверну частину у вигляді CGI-скрипту та шифрувати самим або використовувати SSL. Можливо хтось зустрічав готове рішення на цю тему? Можливо є вагомі аргументи проти такого підходу?

(Багато років тому був якось kermit. Він є зараз?)