"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Shell mit sudo per PHP ausführen

Brain_Death 23.10.2007 - 09:36 3092 31
Posts

b_d

© Natural Ignorance (NI)
Avatar
Registered: Jul 2002
Location: 0x3FC
Posts: 10561
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
Code:
<html>

<a href="script.php">hier</a>

</html>


script.php
Code:
<html>

<?php
echo "<br>";
echo "Executing:<br>";
echo "Result: ".shell_exec("/opt/lampp/htdocs/sms/sh_test/test.sh");
?>

</html>


test.sh
Code:
uptime


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.sh
Code:
scmxx

ändere, gibt er brav folgendes aus:

Zitat
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.sh
Code:
scmxx --version

gibt er folgendes aus:

Code:
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.sh
Code:
scmxx --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
Avatar
Registered: May 2002
Location: In da Oaschicht
Posts: 2558
kannst ihm das passwort nicht "nachschicken"? ka ob das geht...

http://www.php-resource.de/forum/sh...ad/t-61529.html

b_d

© Natural Ignorance (NI)
Avatar
Registered: Jul 2002
Location: 0x3FC
Posts: 10561
ich glaub es liegt doch nicht an den sudo rechten. hab mal 1. post editiert. kann mir da wer weiterhelfen?

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12070
Was gibt dir denn `ls -l /dev/ttyUSB0`?

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
blöde frage, aber schon nur exec() versucht? in der php-doku konnte ich keine detaillierten unterschiede finden, bis auf:
Zitat
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
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
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
Code:
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

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
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

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
Zitat
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

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12070
Zitat von jives
Eins versteh ich nicht: Wenn
Code:
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)
Avatar
Registered: Jul 2002
Location: 0x3FC
Posts: 10561
Zitat von COLOSSUS
Was gibt dir denn `ls -l /dev/ttyUSB0`?
Code:
Ausgabe:
crw-rw---- 1 root dialout 188, 0 Oct 23 12:52 /dev/ttyUSB0 

Zitat von mat
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 :(

Zitat von jives
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 :p


Zitat von jives
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

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12070
Steck den User "www-data" in die (zusaetzliche) Gruppe "dialout".

Code:
usermod -a -G dialout www-data

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
Zitat von COLOSSUS
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)
Avatar
Registered: Jul 2002
Location: 0x3FC
Posts: 10561
Zitat von COLOSSUS
Steck den User "www-data" in die (zusaetzliche) Gruppe "dialout".
Code:
usermod -a -G dialout www-data
wo soll ich das reineditieren? in sudoers wohl nicht, da meldet er dann syntax error in der zeile :p

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
einfach in die shell - wenn www-data der user deines webservers ist.

b_d

© Natural Ignorance (NI)
Avatar
Registered: Jul 2002
Location: 0x3FC
Posts: 10561
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).

Code:
  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)

Code:
sudo usermod -a -G dialout www-data

funktioniert immer noch nicht. mach ich es eh richtig?
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz