Hugo: Shell Befehl mit PHP

Hey!

Ich versuche grad mit einem kleinen Script meinen Computer "fern sprechen" zu lassen.

Der ganze PHP code sieht so aus:

<?php  
if(isset($_REQUEST['text'])){  
  $text = $_REQUEST['text'];  
  shell_exec('say "'.$text.'"');  
  echo $text." wurde gesagt...";  
} else {  
  echo "Please set a text!<br>talk.php?text=Hallo du da";  
}  
?>

Statt "shell_exec" hab ich auch schon "exec" und "system" versucht, half aber beides nichts...

exec('whoami') gibt aber das gewünschte ergebniss.

und

say "Hallo"

funktioniert von der Shell aus, natürlich auch.

Vielleicht weiss wer mehr...

  1. Statt "shell_exec" hab ich auch schon "exec" und "system" versucht, half aber beides nichts...

    Nebst der ziemlich schlimmen Sicherheitsproblematik:  was heisst "hilft nix"?

    1. Nachtrag: und du bist natürlich auch sicher, dass "say" verfügbar ist? ;) espeak wäre übrigens eine alternative

      1. Nicht zu vergessen:

        say liefert mittels shell_exec() an PHP möglicherweise nichts zurück, was du irgendwie ausgeben - zudem tust du auch nichts mit dem rückgabewert von shell_exec().

      2. Nachtrag: und du bist natürlich auch sicher, dass "say" verfügbar ist? ;) espeak wäre übrigens eine alternative

        say ist genau genommen nur ein klitzekleiner espeak wrapper.

          
        #!/usr/bin/env ruby  
          
        if ARGV[0] == 'e'  
          talk = `espeak "#{ ARGV[1] }"`  
        else  
          talk = `espeak -v german "#{ ARGV[0] }"`  
        end
        

        Will ich aber als Wrapper so behalten, weil ich noch mbrola als Speech synthesyser untermischen will, damits schöner klingt.

    2. Statt "shell_exec" hab ich auch schon "exec" und "system" versucht, half aber beides nichts...

      Nebst der ziemlich schlimmen Sicherheitsproblematik:  was heisst "hilft nix"?

      Das mein Computer kein wort gesagt hat...

      Inwiefern sicherheits Problematik?
      Der Server steht hier in meinen Zimmerchen, niemand ausser ich sollte zugriff haben, und das auch nur via ssh. Die Restlichen Sicherheitsaspekte muss ich noch lernen...

  2. Hi!

    if(isset($_REQUEST['text'])){
      $text = $_REQUEST['text'];
      shell_exec('say "'.$text.'"');

    Das Umkopieren von $_REQUEST['text'] nach $text ist unnötig. Es fehlt die Vorkehrung, dass eingegebene " nicht zum Ausbruch aus dem Text führen und man so die Kommandozeile beliebig um Befehle erweitern kann. (Siehe Kontextwechsel, speziell den Abschnitt über Shell-Kommandos in der Fortsetzung gegen Ende.)

    Statt "shell_exec" hab ich auch schon "exec" und "system" versucht, half aber beides nichts...
    exec('whoami') gibt aber das gewünschte ergebniss.

    Dann wird zwar whoami nicht jedoch say im Pfad liegen. Beachte, dass der PATH für den Apachen und damit PHP und interaktive Shells unterschiedlich gesetzt sein kann. Verwende der Einfachheit halber den vollständigen Pfad zu say.

    Lo!

    1. Hallo dedifix

      Auch den vollen Pfad habe ich versucht, bringt leider nichts. (sind übrigens schon im selben pfad (/usr/bin)

      Aber danke!

  3. Moin!

    Der ganze PHP code sieht so aus:

    Nicht so toll... Es fehlt schon mal an jeglicher Sicherheit.

    <?php  
    if(isset($_REQUEST['text'])  && '' != $_REQUEST['text']) {  
      
       $shell = 'echo ' . [link:http://www.php.net/manual/de/function.escapeshellarg.php@title=escapeshellarg]($_REQUEST['text']);  
       echo [link:http://de3.php.net/manual/de/function.htmlentities.php@title=htmlentities]($shell) . "soll ausgeführt werden...<hr />\n";  
       echo htmlentities(`$shell`) . "\n<hr />... wurde zurück gegeben.";  
      
    } else {  
       echo 'Please set a text: <a href="talk.php?text=Hallo+du+da">talk.php?text=Hallo+du+da</a>';  
    }  
    ?>
    

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. <?php

      if(isset($_REQUEST['text'])  && '' != $_REQUEST['text']) {

      Yoda-Conditions FTW :)

      Btw: [code lang=php]empty()

        
      
      >    echo htmlentities(`$shell`) . "\n<hr />... wurde zurück gegeben.";  
        
      hier meintest du wohl `echo shell_exec($shell);`{:.language-php}
      
    2. Danke!

      Das sieht wirklich toll aus, leider wird nach den anpassungen von echo zu say, wieder kein wort gesprochen...

  4. Hey!

    Dar ihr mich auf die Sicherheit hingewiesen habt, und ich sowieso von Anfang an lieber kein PHP genommen hätte, nehm ich jetzt einfach einen Ruby Socket, das sollte dan eigentlich gehen, und auch um einiges Sicherer sein!

    Trotzdem vielen Dank für die Antworten!

    1. Moin!

      das sollte dan eigentlich gehen, und auch um einiges Sicherer sein!

      Mit Sicherheit nicht!

      Du solltest prüfen, ob der Webserver Dein "say" überhaupt ausführen darf. Möglicherweise braucht er dazu Zugriffsrechte. Nicht nur für das Programm, sondern auch für das Device (Gerät).

      <?php echo htmlentities(nl2br(who i am)); ?>

      könnte Dir also weiter helfen, denn Du siehst Deinen Benutzername.

      Dann schaust Du direkt am System in /etc/groups nach, welchen Gruppen der Benutzer angehört und dann in der Dokumentation von "say", welche Benutzerrechte für das Audiodevice nötig sind.

      z.B. hat /dev/audio bei mir folgende Rechteverteilung:

      crw-rw----+ 1 root audio 14, 4 29. Sep 18:23 audio

      Root und die Gruppe audio darf auf das Device zugreifen.

      Fehlermeldungen bekommmst Du wenn Du

        
      <?php echo htmlentities(nl2br(`say "Hallo" 2>&1 `)); ?>
      

      ausführst.

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

      1. Hi Fastfix

        Danke für die Ausführliche Beschreibung, warscheinlich hast du sogar recht und es liegt daran. Das der Server ein eigener Benutzer ist, hatt ich jetzt voll vergessen.

        Ich werde trotzdem beim Ruby Socket bleiben, allein schon weil Ruby einfach so Sympatisch ist, da kann PHP sowieso nicht mithalten xD

        Danke trotzdem

        Grüsse
        HuGo