Klaus1: Mac-Adresse ermitteln funktioniert unter Linux nicht mehr

Hallo,

ich habe einen Webserver, der nur im internen Netz betrieben wird, von Windows auf Linux gewechselt.

Auf einer Seite prüfe ich die Erreichbarkeit eines Geräts (über Ping) und ermittle bei Erfolg auch gleich die Mac-Adresse.

Als erstes musste ich das Ping-Kommando ändern, da unter Windows ein

ping -n 1 $ipadresse

geändert werden musste in

ping -c 1 -w 3 $ipadresse

Das

arp -a $ipadresse

funktionierte zunächst auch direkt, bis ich festgestellt habe, dass das nur für Geräte funktioniert, die im selben IP-Netz liegen. Unter Windows funktionierte es auch für alle anderen (internen) Netze.

Warum aber unter Linux nicht?

Ok, dachte ich, ich ändere den Befehl auf

arping -c 1 -w 3 $ipadresse

aber der Befehl wird (vermutlich wegen fehlender Berechtigung?) nicht ausgeführt. Und das obwohl die Rechte für /usr/sbin/arping auf 755 stehen. Ich habe testweise das arping in ein Shell-Script gepackt und diesem 777 gegeben, das machte aber auch keinen Unterschied.

Auch ein (Keulen-)Eintrag in /etc/sudoers mit

wwwrun ALL=(ALL) ALL

(Laut ps -ef | grep apache läuft der Apache als wwwrun) Ist der Eintrag sofort gültig oder muss ich dafür einen Service neustarten?

Wie bekomme ich arping unter PHP ausgeführt?

LG Klaus

  1. Soweit ich mich einnern kann, erfordern ping u.a. Kommandos des IP-Stack Rootrechte (grundsätzlich). MFG

    1. Tach!

      Soweit ich mich einnern kann, erfordern ping u.a. Kommandos des IP-Stack Rootrechte (grundsätzlich).

      Grundsätzlich nicht. ping und arp kann man als Normalnutzer ausführen. Selbst ip, ifconfig, route und netstat kann man ausführen, zumindest Teile, die nur Informationen abfragen.

      dedlfix.

  2. Erst einmal: Ich habe gehörige Sicherheits-Bauchschmerzen, Dir Tipps zu geben, wie man ein System dazu bringt, nach Aufrufen via Webserver dieses oder jenes mit Root-Rechten auszuführen. Überlege Dir genau, ob das, was Du vor hast, wirklich zu Deinem derzeitigen Wissensstand passt.

    arping -c 1 -w 3 $ipadresse
    

    Wie bekomme ich arping unter PHP ausgeführt?

    Unter Ubuntu läuft es mit dem Aufruf unter PHP offenbar fast ohne weiteres, wenn Du das Gerät mit angibst:

    <?php
    header ( "Content-Type: text/plain; charset=UTF-8" );
    echo `arping -I enp7s0 -w1 -f 192.168.1.251`;
    

    Ausgaben:

    ARPING 192.168.1.251 from 192.168.1.2 enp7s0
    Unicast reply from 192.168.1.251 [02:01:D3:81:50:A5]  1.083ms
    Sent 1 probes (1 broadcast(s))
    Received 1 response(s)
    

    Beachte: arping unterscheidet sich von Linux-Distribution zu Linux-Distribution zu BSD teils erheblich!

    Auch ein (Keulen-)Eintrag in /etc/sudoers mit

    wwwrun ALL=(ALL) ALL

    ... wenn es dennn benötigt wird, dann fehlte da ein NOPASSWD. oder wie willst Du ein Passwort eingeben?

    Unter dem strengen Debian werden root-rechte benötigt:

    <?php
    header ( "Content-Type: text/plain; charset=UTF-8" );
    echo `sudo /usr/sbin/arping -I eth0 -C1 -W1 192.168.1.251`;
    

    Der Eintrag zugörige Eintrag in /etc/sudoers für Debian:

    www-data  ALL=NOPASSWD: /usr/sbin/arping
    

    Falls Du die Adresse übergeben willst, dann denke bitte daran, diese mit escapeshellarg() zu entschärfen. Das ist extrem wichtig, weil Du arping mit root-rechten startest.

    <?php
    header ( "Content-Type: text/plain; charset=UTF-8" );
    
    $ip='192.168.1.251';
    $device='eth0';
    $system = 'sudo /usr/sbin/arping -C1 -W1 -I '
              . escapeshellarg( $device )
              . ' '
              . escapeshellarg( $ip );
    echo $system . PHP_EOL . PHP_EOL;
    echo `$system`;
    
    sudo /usr/sbin/arping -C1 -W1 -I 'eth0' '192.168.1.251'
    
    ARPING 192.168.1.251
    60 bytes from 02:01:d3:81:50:a5 (192.168.1.251): index=0 time=732.132 usec
    
    --- 192.168.1.251 statistics ---
    1 packets transmitted, 1 packets received,   0% unanswered (0 extra)
    rtt min/avg/max/std-dev = 0.732/0.732/0.732/0.000 ms
    

    Jetzt musst Du das Zeug noch an Dein Linux anpassen (Apache-User, Pfad zu arping, ggf. dessen Optionen.

    1. Lieben Dank für die Erläuterungen.

      Ich habe die Ursache dadurch finden können. Ich habe zwar korrekt den Eintrag in /etc/sudoers eingefügt, aber ich musste beim Aufruf auch noch ein "sudeo" vorneanstellen.

      Jetzt funktioniert wieder alles.

      Nochmals Danke!

      LG Klaus