Да вроде нет ^_^ Тут запускается стандартная утилита (ifconfig) и парсится её выход... Разумеется, сама утилита должна существовать ^_^ Если пускается не под рутом - попробуйте чуть-чуть поменять:
- Код: Выделить всё
// old
{$IFDEF unix}
aProcess.Commandline := 'ifconfig';
{$ENDIF}
//new
{$IFDEF unix}
aProcess.Commandline := '/sbin/ifconfig';
{$ENDIF}
Тут считывается IP адрес, кстати, для мак будет:
- Код: Выделить всё
program Project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, process
{ you can add units after this };
{$R project1.res}
Var
aProcess: TProcess;
aStrings: TStringList;
aString, aBuffer: String;
i: Integer;
begin
aProcess := TProcess.Create(Nil);
{$IFDEF windows}
aProcess.Commandline := 'ipconfig /all';
{$ENDIF}
{$IFDEF unix}
aProcess.Commandline := '/sbin/ifconfig';
{$ENDIF}
aProcess.Options := [poUsePipes,poNoConsole];
aProcess.Execute;
SetLength(aBuffer, 1000);
Repeat
i := aProcess.Output.Read(aBuffer[1], Length(aBuffer));
aString := aString + Copy(aBuffer, 1, i);
Until i = 0;
aProcess.Free;
aStrings := TStringList.Create;
aStrings.Text := aString;
For i := 0 To aStrings.Count - 1 Do
{$IFDEF windows}
If Not(Pos(':', aStrings[i]) = 0) And Not(Pos('-', aStrings[i]) = 0) Then
Begin
aString := aStrings[i];
Delete(aString, 1, Pos(':', aString) + 1);
If Length(aString) = 17 Then WriteLn(aString);
End;
{$ENDIF}
{$IFDEF unix}
If Not(Pos('ether ', aStrings[i]) = 0) Then
Begin
aString := aStrings[i];
Delete(aString, 1, Pos('ether ', aString) + 5);
WriteLn(aString);
End;
{$ENDIF}
aStrings.Free;
ReadLn;
end.
Хотя кошмар ^_^ Было бы чуть-чуть лучше, если бы использовались регулярные выражения, но не умею ^_^