Изпълнение на команда на Linux сървър от Delphi

Може би този въпрос не е съвсем по темата на конференцията, но много бих искал да знам как да изпълня програма от Delphi програма, работеща под Win 2K на компютър, работещ с Червената шапчица. (Програмата, разбира се, Linux). Моят колега системен администратор знае как да превърне компютър с Win2K в конзола на Linux машина (с помощта на клиентската страна и някакъв вид SSH). Но как да го направя не с химикалки, а от програмата? Извинете, ако не е по темата

Потърсете в мрежата XWindow за windows и/или SSH за Delphi, можете просто да вземете спецификациите и да го създадете сами, но е доста трудно

Най-малко - потърсете компонент, който имплементира протокола telnet, ако е необходимо криптиране - компонент, който имплементира ssh / ssh2 (не съм срещал такива Delphi, поемете риска да търсите freeware COM компоненти) или използвайте пакета telnet + stunnel ( http://www.stunnel.org/ ).

Telnet се реализира повече или по-малко директно от компоненти на Indy (започвайки с WinShoes, мисля)

Заглавие: Функция за отдалечено изпълнение (Unix REXEC) Автор: Майк Хейдън Продукт: Delphi 5.x (или по-нова) Дата на публикуване: 23.10.2002 г.

Функция за дистанционно изпълнение (Unix REXEC)

Тази функция ще изпълни команда към Unix кутия (или която и да е TCP връзка, която поддържа REXEC - порт 512) и ще върне показаните резултати във файл. В момента го използвам на системи HP и SUN.

Параметрите на RExec() са

HostIP : низ // напр. "196.11.121.160" Потребителски ИД: низ // напр. "root" Парола : низ // напр. "fraqu34" Команда: низ // напр. "export TERM=vt100; dv" ResultFilename: низ // напр. "c:\temp\uxresult.txt"

Функцията връща true, ако е успешна, в противен случай връща false.

напр. "export TERM=vt100; export APP=baan; run_mycommand"

Пример за употреба е. (промяна в директория /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: низ): boolean; вар. TCP: TClientSocket; i: цяло число; TxOut: файл; Буфер, Cr, Lf: байт; Неуспешно: boolean; започнете Неуспешно := вярно; // Приемане на първоначално състояние на грешка Cr := 13; // Връщане на каретка Char Lf := 10; // Line Feed Char 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 отвори OK, тогава изпратете командата към хоста // и запишете резултатите в посочения файл ако TCP.Active тогава започнете 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); край друго BlockWrite(TxOut, буфер, 1); край;

TCP.Close; Затваряне на файл (TxOut); Неуспешно := невярно; край; накрая TCP.Free; край;

Огромно благодаря за отговорите. За съжаление, нашият сисадмин не желае да инсталира на страната на сървъра, нито поддържа теленета, нито поддържа REXEC (видимо, из-от съображения за сигурност). Самият той работи чрез небезплатен (!) Лосион, използвайки SSH. Той предлага да напишете сървърната страна като CGI скрипт и да го шифровате сами или да използвате SSL. Може би някой е срещнал готово решение по тази тема? Може би има сериозни аргументи срещу подобен подход?

(Преди много години имаше някакъв кермит. Там ли е сега?)