Shell Befehl per PHP

    Shell Befehl per PHP

    Hallo liebe Leute,

    Mein Anliegen:
    Ich habe einen Radiostream(auf einem fremden Server) laufen. Da nicht immer jemand auf Sendung sein kann habe ich auf meinem VServer einen Playlistserver aufgesetzt, der auch super funktioniert..
    Nun möchte ich jedem Moderator die Möglichkeit geben, die Playlist an bzw auszustellen, onair, bzw offair gehen kann.
    Das ganze denke ich kann am besten mit PHP realisiert werden.

    Es soll also eine leere PHP Seite mit 2 buttons erscheinen, ein Start und ein Stop Button.
    Wenn jemand auf den Start Button klickt, soll PHP sich automatisch auf den Shell einloggen und in ein bestimmtes Verzeichnis wechseln und das Kommando ./sc_trans_linux & ausführen. Anschließend soll er sich natürlich auch automatisch ausloggen.
    Bei dem Stop Button müsste er die Kill ID / Prozess ID herausfinden und den Prozess per kill beenden.

    Ich hoffe es finden sich hier PHP und Linux-Freaks, die mir helfen können..

    Vielen Dank schonmal im Vorraus,
    Martin

    RE: Shell Befehl per PHP

    @ Mumpits

    Ich hoffe es finden sich hier PHP und Linux-Freaks, die mir helfen können..


    Eher weniger, aber ich versuchs trotzdem mal.
    Im PHP gibt es den Befehl system. Da ich nicht weiss, ob system auch "&" ausführt, damit dein Programm nach dem Aufruf zur Shell zurückkehrt, würde ich dir empfehlen, mit diesem Befehl ein Skript aufzurufen, was ungefähr folgenden Inhalt hat:

    Quellcode

    1. #! /bin/bash
    2. /home/.../sc_trans_linux &
    3. echo "$!" > /home/.../sc_trans_linux.pid


    Zum Beenden des Programmes empfiehlt sich dann folgendes Script:

    Quellcode

    1. #! /bin/bash
    2. kill `cat home/.../sc_trans_linux.pid`


    Diverse Abfragen, bspw. mit if [ -e ... ob ein Pidfile existiert überlasse ich dann dir. Diese wären wahrscheinlich eh sinnvoller in deiner PHP Umgebung untergebracht, da du es dann gleich dem Nutzer mitteilen kannst.

    Wenn du die Scripte direkt aufrufen willst, vergiss nicht, sie mit chmod ausführbar zu machen.
    @ Mumpits

    Sorry, aber den PHP Code dafür hab ich gerad nicht im Kopf, da wirst du selber paar Tutorials wälzen müssen.

    Was das Einloggen betrifft, wozu? Ein PHP Script welches sich abarbeiten lässt, ist ja automatisch eingeloggt. Es kann dir höhstens passieren, dass PHP keine Rechte weiter hat, aber das musst du dann mit deinem Provider klären.
    @ mumpits

    Sich via PHP mit einem gespeicherten Passwort über SSH einzuloggen ist ziemlich fahrlässig. Einfacher wäre es, du schmeisst das Script in ein Verzeichnis das für jeden zugänglich ist (bspw. chmod 755) und machst es dann ebenfalls für jeden ausführbar (chmod 711). Dann kann der User unter dem PHP Scripte ausgeführt werden das Program starten. Die Frage wäre dann noch, ob das Script auf Resourcen zurückgreift, die dem PHP User nicht zugänglich sind.

    In dem Falle wäre bspw. dann sudo zu empfehlen, natürlich mit einer engen Restriktion was das Ausführen von Befehlen angeht. Als erstes solltest du rausfinden, mit welchem User deine Scripte laufen.

    Anschliesend machst du folgendes:

    su -c "visudo" (dann root Passwort eingeben)

    In der sich öffenden Datei fügst du eine neue Zeile an:

    Quellcode

    1. webuser ALL=(scriptuser) NOPASSWD:/home/scriptdir/script.sh


    Zum Editieren drückst du einmal "i" und zum Speichern dann <ESC> und danach ":wq" (ohne die "").

    Pass aber auf, dass der Webuser nicht das Recht hat, die script.sh zu bearbeiten oder durch eine andere Datei zu ersetzen... ;)
    So ich habe mir mal was zusammengestellt... jedoch funktioniert es nicht ganz, "headers already set" wenns um den cookie geht.. und es führt beim anklicken der buttons kein commando aus!

    HTML-Quellcode

    1. <?
    2. function check($pass)
    3. {
    4. $return=false;
    5. $hash=file('pass');
    6. $hash=$hash[0];
    7. if ($hash == md5($pass))
    8. {
    9. $return=true;
    10. }
    11. return $return;
    12. }
    13. if ($_GET['SCHROTT'] == "")
    14. {
    15. echo ('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    16. <html>
    17. <head>
    18. <title>shoutcast micropanel</title>
    19. </head>
    20. <style>
    21. body{background-color:#ffffff; font-size:9pt; font-family:sans-serif;}
    22. input{border:solid 1px #000000; font-size:9pt; font-family:sans-serif;}
    23. table{font-size:9pt; font-family:sans-serif;}
    24. a{font-size:9pt; font-family:sans-serif; color:#444444; font-weight:bold;}
    25. </style>
    26. <body>');
    27. $loggedin=false;
    28. if ($_POST['pass'] == "" and $_COOKIE['pass'] == "")
    29. {
    30. //login
    31. echo ("<table><tr><td>Password:</td><td><form action=$PHP_SELF method=post><input type=password name=pass></td><td><input type=submit value='O.K.'></td></table></form>");
    32. }
    33. elseif ($_POST['pass'] != "" and $_COOKIE['pass'] == "")
    34. {
    35. if (check($_POST['pass']))
    36. {
    37. $loggedin=true;
    38. setcookie('pass', $_POST['pass']);
    39. }
    40. else
    41. {
    42. die ('Wrong Password, try <a href="javascript:history.back()">again</a>');
    43. }
    44. }
    45. elseif ($_COOKIE['pass'] != "")
    46. {
    47. if (check($_COOKIE['pass']))
    48. {
    49. $loggedin=true;
    50. }
    51. else
    52. {
    53. setcookie('pass', "");
    54. echo('User management error, please re-login. Your Browser *MUST* accept cookies.');
    55. }
    56. }
    57. if (!$loggedin)
    58. {
    59. die ('');
    60. }
    61. else
    62. {
    63. echo ('<center><div style="border:solid 1px #000000; width:300; padding:0; margin:5;">
    64. <div style="border-bottom:solid 1px #000000; width:300px; min-width:300px; font-decoration:underlined; background-color:#bbbbbb; font-weight:bold;">
    65. Show-itJukebox Shoutcast Port6666:
    66. </div>
    67. <div style="margin:5px; padding-left:5; padding-right:5; border:solid 1px #000000; width:280;">
    68. <center><a target=execute href=' . $PHP_SELF . '?SCHROTT=conf&action=1> Jukebox Einschalten</a> <a target=execute href=' . $PHP_SELF . '?SCHROTT=conf&action=2>Jukebox Auschalten</a></center>
    69. </div>
    70. </div>
    71. <div style="border:solid 1px #000000; width:300; padding:0; margin:5;">
    72. <div style="border-bottom:solid 1px #000000; width:100%; font-decoration:underlined; background-color:#bbbbbb; font-weight:bold;">
    73. Executing Output:
    74. </div>
    75. <iframe name=execute frameborder=0 width=280; height=60; style="margin:5px; border:solid 1px #000000;" src=about:blank ></iframe>
    76. </div>
    77. </center>
    78. </body>
    79. </html>
    80. ');
    81. }
    82. }
    83. else
    84. {
    85. switch ($_GET['SCHROTT'])
    86. {
    87. case 'status':
    88. { echo ('
    89. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    90. <html>
    91. <head>
    92. <title>shoutcast micropanel</title>
    93. <meta http-equiv="refresh" content="3; URL='
    94. . $PHP_SELF
    95. . '?SCHROTT=status">
    96. </head>
    97. <style>
    98. body{background-color:#ffffff; font-size:9pt; font-family:sans-serif;}
    99. input{border:solid 1px #000000; font-size:9pt; font-family:sans-serif;}
    100. table{font-size:9pt; font-family:sans-serif;}
    101. a{font-size:9pt; font-family:sans-serif; color:#444444; font-weight:bold;}
    102. </style>
    103. <body>
    104. <center>');
    105. echo ('</center></body></html>');
    106. }
    107. break;
    108. case 'chpass':
    109. {
    110. echo ('
    111. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    112. <html>
    113. <head>
    114. <title>shoutcast micropanel</title>
    115. </head>
    116. <html>
    117. <head>
    118. <title>shoutcast micropanel</title>
    119. </head>
    120. <style>
    121. body{background-color:#ffffff; font-size:7pt; font-family:sans-serif;}
    122. input{border:solid 1px #000000; font-size:9pt; font-family:sans-serif;}
    123. table{font-size:9pt; font-family:sans-serif;}
    124. a{font-size:9pt; font-family:sans-serif; color:#444444; font-weight:bold;}
    125. </style>
    126. <body>
    127. ');
    128. if (check($_COOKIE['pass']))
    129. {
    130. $exe="/var/www/web3/html/media/sc_trans_040/radiostart.sh";
    131. echo ("Starting...<br>Executing '$exe'");
    132. system ($exe);
    133. }
    134. else
    135. {
    136. echo ('Denied.');
    137. }
    138. echo ('</body></html>');
    139. break;
    140. }
    141. case 'stop':
    142. {
    143. echo ('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    144. <html>
    145. <head>
    146. <title>shoutcast micropanel</title>
    147. </head>
    148. <style>
    149. body{background-color:#ffffff; font-size:7pt; font-family:sans-serif;}
    150. input{border:solid 1px #000000; font-size:9pt; font-family:sans-serif;}
    151. table{font-size:9pt; font-family:sans-serif;}
    152. a{font-size:9pt; font-family:sans-serif; color:#444444; font-weight:bold;}
    153. </style>
    154. <body>');
    155. if (check($_COOKIE['pass']))
    156. {
    157. $exe="/var/www/web3/html/media/sc_trans_040/radiostop.sh";
    158. echo ("Stopping...<br>Executing '$exe'");
    159. system ($exe);
    160. }
    161. else
    162. {
    163. die ('Denied.');
    164. }
    165. echo ('</body></html>');
    166. break;
    167. }
    168. case 'logout':
    169. {
    170. echo ('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    171. <html>
    172. <head>
    173. <title>shoutcast micropanel</title>
    174. <meta http-equiv="refresh" content="2; URL=index.php">
    175. </head>
    176. <style>
    177. body{background-color:#ffffff; font-size:9pt; font-family:sans-serif;}
    178. input{border:solid 1px #000000; font-size:9pt; font-family:sans-serif;}
    179. table{font-size:9pt; font-family:sans-serif;}
    180. a{font-size:9pt; font-family:sans-serif; color:#444444; font-weight:bold;}
    181. </style>
    182. <html>
    183. <style>
    184. body{background-color:#ffffff; font-size:7pt; font-family:sans-serif;}
    185. input{border:solid 1px #000000; font-size:9pt; font-family:sans-serif;}
    186. table{font-size:9pt; font-family:sans-serif;}
    187. a{font-size:9pt; font-family:sans-serif; color:#444444; font-weight:bold;}
    188. </style>
    189. <body>
    190. <html>
    191. <head>
    192. <title>shoutcast micropanel</title>
    193. </head>
    194. <style>
    195. body{background-color:#ffffff; font-size:7pt; font-family:sans-serif;}
    196. input{border:solid 1px #000000; font-size:9pt; font-family:sans-serif;}
    197. table{font-size:9pt; font-family:sans-serif;}
    198. a{font-size:9pt; font-family:sans-serif; color:#444444; font-weight:bold;}
    199. </style>
    200. <body>');
    201. $action=$_GET['action'];
    202. if ($action=="1") {
    203. system("/var/www/web3/html/media/sc_trans_040/radiostop.sh");
    204. echo "Jukebox gestoppt";
    205. }
    206. elseif ($action=="2") {
    207. system("/var/www/web3/html/media/sc_trans_040/radiostart.sh");
    208. echo "Jukebox aktiviert";
    209. }
    210. echo ('</body></html>');
    211. break;
    212. }
    213. }
    214. }
    215. ?>