b_d
© Natural Ignorance (NI)
|
betreff sagt eigentlich alles. ich will ein shell script welches ein befehl mit sudo rechten per php ausführt. hab auch schon gegoogel und so weit habs ichs mal: OHNE (!) sudo rechte: index.html<html>
<a href="script.php">hier</a>
</html>
script.php<html>
<?php
echo "<br>";
echo "Executing:<br>";
echo "Result: ".shell_exec("/opt/lampp/htdocs/sms/sh_test/test.sh");
?>
</html>
test.shuptime
soda, ich glaub es liegt doch nicht an sudo rechten. folgendes: der command den ich ausführen will heisst scmxx. ist ein kommunitkations tool für siemens handys. also wenn ich in die test.sh in test.shscmxx
ändere, gibt er brav folgendes aus: This is a program written by Hendrik Sattler This program is licenced with the GPL. Use at your own risk! You need a phone made by Siemens to get an useful result. ... bla bla bla yada yada yada so weit so gut. wenn ich dem ganzen noch ein argument gebe, also zB: test.shscmxx --version
gibt er folgendes aus: 0.8.2
also passt das. wenn ich aber nun testen will, ob das handy richtig erkannt wurde würde der code so lauten: test.shscmxx --device /dev/ttyUSB0 --info
hier gibt er aber genau garnichts aus in der konsole funkt es aber ! ich glaub es liegt an folgendem. scmxx mit und ohne --version gibt er in der konsole in einer millisekunde aus. sobald ich aber auf das handy zugreife, braucht er in der konsole ne weile und gibt erst dann die daten des angeschlossenene handys aus. und das wartet php nach gefühl einfach nicht ab, sprich er führt den befehl wahrscheinlich aus, sieht aber in der einen millisekunde nix und gibt so auch nix aus. weiß DA einer rat???
Bearbeitet von b_d am 17.11.2007, 11:50
|
Lobo
Here to stay
|
|
b_d
© Natural Ignorance (NI)
|
ich glaub es liegt doch nicht an den sudo rechten. hab mal 1. post editiert. kann mir da wer weiterhelfen?
|
COLOSSUS
AdministratorGNUltra
|
Was gibt dir denn `ls -l /dev/ttyUSB0`?
|
mat
AdministratorLegends never die
|
blöde frage, aber schon nur exec() versucht? in der php-doku konnte ich keine detaillierten unterschiede finden, bis auf: Note: If you start a program using this function and want to leave it running in the background, you have to make sure that the output of that program is redirected to a file or some other output stream or else PHP will hang until the execution of the program ends.
|
jives
And the science gets done
|
Du könntest zu Testzwecken auch ein kleines Shellscript schreiben, das irgendeinen Output _verzögert_ liefert, um dieses kleine Delay eventuell als Fehlerquelle ausschließen zu können. Eins versteh ich nicht: Wenn scmxx --device /dev/ttyUSB0 --info
in der Shell ohne root-Rechte funktioniert, wieso braucht dann ein Aufruf von PHP aus root-Rechte? Wenn man per PHP einen Befehl ausführt, wem "gehört" der Prozess dann? Vielleicht hat dieser User keine Berechtigungen, um auf USB-Devices zugreifen zu können?
Bearbeitet von jives am 23.10.2007, 11:36
|
mat
AdministratorLegends never die
|
mir sind noch 2 dinge eingefallen. vergleiche mal den output von shell_exec('set') mit den gewünschten env-vars. könnte sein, dass PATH nicht richtig gesetzt ist.
auch wichtig: debuggen wäre nicht schlecht. vl gibt dir dein command einen fehler zurück und du siehst ihn atm nicht. gibt mal "2>&1" ans ende des commands, dann bekommst du stderr umgeleitet.
|
mat
AdministratorLegends never die
|
Wenn man per PHP einen Befehl ausführt, wem "gehört" der Prozess dann? Vielleicht hat dieser User keine Berechtigungen, um auf USB-Devices zugreifen zu können? wenn php nicht per cgi oder fast-cgi aufgerufen wird, dann gehört der prozess dem user unter dem der webserver läuft.
|
COLOSSUS
AdministratorGNUltra
|
Eins versteh ich nicht: Wenn
scmxx --device /dev/ttyUSB0 --info
in der Shell ohne root-Rechte funktioniert, wieso braucht dann ein Aufruf von PHP aus root-Rechte? Wenn man per PHP einen Befehl ausführt, wem "gehört" der Prozess dann? Vielleicht hat dieser User keine Berechtigungen, um auf USB-Devices zugreifen zu können? In der Shell ist seine EUID offensichtlich eine andere als die des Nutzers www-data. Wenn nun sein Shell-User eine supplementary group membership hat, die ihn zum Schreiben auf /dev/ttyUSB0 berechtigt (das braucht man fuer so serielle Geschichtln immer; ich mit meinem GSM-Terminal daheim z. B. auch), kann er mit dem Modem kommunizieren, waehrend www-data das mangels Gruppenmitgliedschaft nicht kann. Auch wenn PHP nicht via mod_php, sondern via [f]cgi ausgefuehrt wird, "gehoert" der resultierende Prozess der EUID des Webservers - es sei denn, man nutzt zusaetzlich suexec (was der entscheidende Vorteil eines solchen Setups ist; ohne macht's keinen wirklichen Sinn).
|
b_d
© Natural Ignorance (NI)
|
Was gibt dir denn `ls -l /dev/ttyUSB0`? Ausgabe:
crw-rw---- 1 root dialout 188, 0 Oct 23 12:52 /dev/ttyUSB0
blöde frage, aber schon nur exec() versucht? nein, aber jetzt grad probiert bei shell_exec() gibt er ALLES aus bei exec() NUR die LETZTE zeile device abfrage geht aba wie gehabt mit beiden nicht Du könntest zu Testzwecken auch ein kleines Shellscript schreiben, das irgendeinen Output _verzögert_ liefert, um dieses kleine Delay eventuell als Fehlerquelle ausschließen zu können. klingt FABELhaft und die idee hat ich auch schon, nur hab ich keine ahnung WIE help Wenn yadayadayada in der Shell ohne root-Rechte funktioniert, wieso braucht dann ein Aufruf von PHP aus root-Rechte? genau das hab ich mir nach gut einer stunde testen auch gedacht und deshalb bin ich von der idee mit sudo wegekommen und glaub es liegt eher daran, wie schon gesagt, dass er "zu schnell was ausgeben will aber eben nicht kann" (bei device abfrage, bei --version gehts halt zB weil schnell) aber keine ahnung ob mein gedankengang richtig ist @ 3 letzten post: so ziemlich garnichts davon verstanden wirkich sorry, ich bin kein linux guru bin aber bei dem projekt forciert linux zu verwenden. bitte gleich schreiben was ich genau versuchen soll, dann gehts eh!
|
COLOSSUS
AdministratorGNUltra
|
Steck den User "www-data" in die (zusaetzliche) Gruppe "dialout". usermod -a -G dialout www-data
|
mat
AdministratorLegends never die
|
Auch wenn PHP nicht via mod_php, sondern via [f]cgi ausgefuehrt wird, "gehoert" der resultierende Prozess der EUID des Webservers - es sei denn, man nutzt zusaetzlich suexec (was der entscheidende Vorteil eines solchen Setups ist; ohne macht's keinen wirklichen Sinn). jein, es kann auch verwendet werden um mehrere php-versionen parallel laufen zu haben. dennoch würde ich es nicht ohne suexec betreiben.
|
b_d
© Natural Ignorance (NI)
|
Steck den User "www-data" in die (zusaetzliche) Gruppe "dialout".
usermod -a -G dialout www-data
wo soll ich das reineditieren? in sudoers wohl nicht, da meldet er dann syntax error in der zeile
|
mat
AdministratorLegends never die
|
einfach in die shell - wenn www-data der user deines webservers ist.
|
b_d
© Natural Ignorance (NI)
|
soda, um es mal aufzuzählen. zuerst hab ich die sudoer datei editiert (LETZE zeile) ich speicher das editierte immer als sudoers.tmp UND als sudoers (ohne nix). GNU nano 1.3.10 File: /etc/sudoers.tmp
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults
Defaults !lecture,tty_tickets,!fqdn
# User privilege specification
root ALL=(ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
www-data ALL=(ALL) NOPASSWD: /opt/lampp/htdocs/sms/sh_scmxx_info/test.sh
dann den befehl in der shell ausgeführt: (mit sudo, ohne gehts nicht) sudo usermod -a -G dialout www-data
funktioniert immer noch nicht. mach ich es eh richtig?
|