Ankündigung

Einklappen
Keine Ankündigung bisher.

inhalt aus ein Array an "shell_exec" übergeben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • inhalt aus ein Array an "shell_exec" übergeben

    Hi,

    ich schriebe mir gerade ein Script, was die eingeloggten User überprüft.

    1: Frage ab, wer an der Maschine grad eingeloggt ist (who)
    2: Ermittle IP Adresse
    3: Ermittle IP Adresse von einer Dyndns adresse
    4: Vergleiche beide IP Adressen und schicke Mail falls IP Adressen abweichend sind.

    So: Prinzipell habe ich das Script fertig und es läuft.
    Leider wird nur der letzte User der sich eingeloggt hat berücksichtigt. Also nicht alle, die am System angemeldet sind.

    Also habe ich das Script ein bissel umgeschrieben und die Daten, die von who geliefert werden in ein array gepackt.

    Da ich mich mit Schleifen immer noch sehr sehr schwer tute muß ich jetzt mal um Hilfe bitten.

    Hier auszugsweise das Script:

    PHP-Code:
    #!/usr/bin/php -q
    <?php
     error_reporting
    (E_ALL);
     
    ini_set("display_errors"1);

     
    $last_login = array(shell_exec("who | cut -d ')' -f 1 - | cut -d '(' -f 2 -"));

     
    var_dump($last_login);

     
    $dyndns shell_exec("ping -c1 xxxx.dyndns.org | head -2 -n1 | awk '{print $3}' | cut -d ')' -f 1 - | cut -d '(' -f 2 -");
     echo 
    $dyndns;
    var_dump + echo Ausgaben:
    Code:
    array(1) {
      [0]=>
      string(80) "dslb-094-xxx-007-034.pools.arcor-ip.net
    dslb-094-xxx-007-034.pools.arcor-ip.net
    "
    }
    94.xxx.7.34
    Ich müsste jetzt erstmal $last_login einzeln per shell_exec an ping übergeben (natürlich mit den head/awk/cut-Befehl um nur die IP-addy zurück zu erhalten). Den Output von shell_exec müsste dann wieder zurück in ein array geschrieben werden, den ich dann später mit $dyndns vergleichen kann.

    Der Ablauf ist somit klar... nur bei der while Schleifen Umsetzung haperts

    Danke


  • #2
    irgendwie sehe ich hier keine while?

    Kommentar


    • #3
      Weil ich keinen Mist posten wollte... denn das was ich bisher hab, ist eine Endlos Schleife

      PHP-Code:
       while(
        
      $test = array(shell_exec("ping -c1 $last_login | head -2 -n1 | awk '{print $3}' | cut -d ')' -f 1 - | cut -d '(' -f 2 -"))
       ); 
      Output:
      Code:
      ping: unknown host Array
      ping: unknown host Array
      ping: unknown host Array
      ping: unknown host Array
      ping: unknown host Array
      ping: unknown host Array
      ping: unknown host Array
      ping: unknown host Array
      ping: unknown host Array
      ping: unknown host Array
      ^C

      Kommentar


      • #4
        Zuerst solltest du verstehen wie eine while schleife aufgebaut ist:

        PHP-Code:
        while ($condition === true) {
            
        // Auszuführender Code

        heisst soviel wie "Solange das was in klammern steht true ergibt, führe den Auszuführenden Code aus"

        Versuche es jetzt nocheinmal und melde dich erneut wenn du nicht weiter kommst.

        Kommentar


        • #5
          Zitat von lord_icon Beitrag anzeigen
          PHP-Code:
           while(
            
          $test = array(shell_exec("ping -c1 $last_login | head -2 -n1 | awk '{print $3}' | cut -d ')' -f 1 - | cut -d '(' -f 2 -"))
           ); 
          Oweh, ist das überhaupt eine gültige Syntax für eine while-Schleife?

          Zu deinem Problem: Du hast ein Array, in diesem Array liegen Strings und mit denen möchtest du arbeiten. Also möchtest du das Array durchlaufen:
          PHP-Code:
          $test = array();
          foreach(
          $last_login as $curr_login) {
            
          $test[$curr_login] = array(shell_exec("ping -c1 $curr_login | head -2 -n1 | awk '{print $3}' | cut -d ')' -f 1 - | cut -d '(' -f 2 -")));  

          Die Rückgabe wird hier ebenfalls in einem Array gespeichert zur nachträglichen Weiterverarbeitung (Schlüssel ist die IP/Domain)
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Verständnissfrage:

            Ich zähle die Zeilen im Array (2)
            While sage ich dann, das er 2 mal durchgehen soll
            In der while Schleife erhöhe ich dann jeweils um 1 Zeile


            Wäre das der korrekte Weg ?

            Kommentar


            • #7
              Zitat von lord_icon Beitrag anzeigen
              Verständnissfrage:

              Ich zähle die Zeilen im Array (2)
              While sage ich dann, das er 2 mal durchgehen soll
              In der while Schleife erhöhe ich dann jeweils um 1 Zeile


              Wäre das der korrekte Weg ?
              Jup, geht auch. Grundsätzlich kann man jede Schleifenart durch eine andere Schleifenart ersetzen, d.h. man kann eine while-Schleife zur for-Schleife umprogrammieren, und umgekehrt.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Wenn die schleife immer 2 mal durchlaufen werden soll währe eine for-schleife natürlich schlüssiger.

                Übrigens:
                Weil ich keinen Mist posten wollte... denn das was ich bisher hab, ist eine Endlos Schleife
                Wenn du deinen "mist" nicht postest kann keiner herausfinden wo der Fehler ist.

                Kommentar


                • #9
                  oki... ich hänge jetzt aber schon an de Zeilenauslesung.

                  Code:
                  echo count($last_login);
                  zeigt mir nur 1 an, obwohl 2 Hostname's drin sind.

                  array(1) {
                  [0]=>
                  string(80) "dslb-094-xxx-007-034.pools.arcor-ip.net
                  dslb-094-xxx-007-034.pools.arcor-ip.net
                  "
                  }
                  Also würde ich das mittels explode Zeilenumbrüche hinzufügen.
                  Aber PHP findet das wohl nicht sehr sinnig.
                  PHP-Code:
                  <?php
                  $last_login 
                  explode(" ", array(shell_exec("who | cut -d ')' -f 1 - | cut -d '(' -f 2 -")));
                  ?>
                  Notice: Array to string conversion in ../login_pruefung.php on line 7
                  Und selbst wenn ich das nun in zwei Zeilen konvertieren kann => navigiere ich dann nicht auf eine Sackgasse zu ?
                  Wäre ein mehrdym. Array nicht besser, wenn ich später in der Schleife +n hochzählen will ?
                  Oder kann ich das dann auch Zeilenbasiert umsetzen ?

                  @lstegelitz
                  Dein code gibt mittels var_dump nix aus. Sicherlich, wegen oben beschriebenes Problem.

                  Kommentar


                  • #10
                    shell_exec liefert schon einen String zurück. Du bastelst diesen String in ein Array, um dieses gleich danach wieder zu einem String zu expandieren... unnötig.

                    und explode macht aus einem String ein array, du willst aber aus einem Array einen String machen (implode!). Daher auch die Fehlermeldung.
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      soo... bin jetzt schon mal reichlich weiter.

                      Da keiner geantwortet hat, ob ich mich in der Zeilenbasierten Array in eine Sackgasse bewege, hab ich das array erstmal in ein mehrdym. array gewandelt:

                      PHP-Code:
                       $last_login implode(array(shell_exec("who | cut -d ')' -f 1 - | cut -d '(' -f 2 -")));
                       
                      $last_login preg_split('/\s+/'trim($last_login)); 
                      Code:
                      array(2) {
                        [0]=>
                        string(39) "dslb-094-xxx-007-034.pools.arcor-ip.net"
                        [1]=>
                        string(39) "dslb-094-xxx-007-034.pools.arcor-ip.net"
                      }
                      Die Schleife hab ich damit dann auch (weitesgehend) umsetzen können.
                      PHP-Code:
                      $i 0;
                       while(
                      $i count($last_login))
                       {
                         
                      $test = array(shell_exec("ping -c1 $last_login[$i] | head -2 -n1 | awk '{print $3}' | cut -d ')' -f 1 - | cut -d '(' -f 2 -"));
                         
                      $i++;
                       } 
                      Edit: echo count($last_login) = 2
                      Problem dabei... soweit ich das jetzt verstanden habe, überschreibe ich mein Array mit jeden Durchlauf (?)
                      Zumindest habe ich nur einen Eintrag drin, obwohl ich ja mit $i das ganze mehrmals durchlaufen lassen.

                      Code:
                      array(1) {
                        [0]=>
                        string(12) "94.xxx.7.34
                      "
                      }
                      Gehen meine Vermutungen in die richtige Richtung oder liegt woanderes das Problem ?

                      Kommentar


                      • #12
                        versuche mal folgendes:

                        PHP-Code:
                        $test = array();
                         while(
                        $i count($last_login))
                         {
                           
                        $test[] = array(shell_exec("ping -c1 $last_login[$i] | head -2 -n1 | awk '{print $3}' | cut -d ')' -f 1 - | cut -d '(' -f 2 -"));
                           
                        $i++;
                         } 

                        Kommentar


                        • #13
                          okaaay.

                          Sehr interessant. Works

                          Code:
                          array(2) {
                            [0]=>
                            array(1) {
                              [0]=>
                              string(12) "94.xxx.7.34
                          "
                            }
                            [1]=>
                            array(1) {
                              [0]=>
                              string(12) "94.xxx.7.34
                          "
                            }
                          }

                          Kommentar


                          • #14
                            reicht für die Ermittlung der IP nicht einfach ein gethostbyname() ?
                            DevBlog|3D Online-Shopping|Xatrium

                            Kommentar


                            • #15
                              Zitat von Tiberius Beitrag anzeigen
                              reicht für die Ermittlung der IP nicht einfach ein gethostbyname() ?
                              lol... stimmt. Wäre vvlt. ein bissel einfacher gewesen.
                              Wobei gethostbyname nur shell_exec ersetzt.
                              Wäre im 2ten Schritt = Optimierung des Scriptes sicherlich sinnvoll.

                              Der PHP Code + die Probleme bleiben davon aber unbeindruckt.

                              Wobei ich dann auch schon beim letzten Problem bin (i hope so)

                              Vergleiche nun die IP addy vom Dyndns Account mit den angemeldeten Benutzern. Wenn jeweils nur eine IP = kein Problem.
                              Allerdings muß ich ja nun wieder das ganze array durchlaufen.

                              PHP-Code:
                              $i 0;
                              if (
                              $dyndns ==
                                   while(
                              $i count($last_login))
                                     {
                                      print 
                              $last_login[$i];
                                      
                              $i++;
                                     }
                                  )
                               { echo 
                              'gleich';}
                               else
                               {echo 
                              'ungleich';} 
                              Code:
                              PHP Parse error:  syntax error, unexpected T_WHILE in ../login_pruefung.php on line 29

                              Edit: Ich vermute mal, das das IF in die WHILE Schleife kommt... und nicht dich Schleife in das IF (ma gugen, was da rauskommt)

                              Kommentar

                              Lädt...
                              X