Grundeinstellungen
|
Python-Programme
sind typischer Weise dem Benutzer 'root' zugeordnet. Dagegen wird
als Benutzer von PHP-Programmen 'www-data' genannt. Damit
'www-data' auf Dateien des Benutzes root zugreifen kann, müssen
in der Datei sudoers.tmp Einstellungen vorgenommen werden.
1.
NANO Editor mit der Datei sudoers.tmp öffnen durch ..
sudo
visudo
2.
Rechte für www-data an dem python-Interpreter und dem zu
startenden Programm hinzufügen
www-data
ALL=(ALL) NOPASSWD: /usr/bin/python /usr/test.py
2a.
Soll das Python-Programm mit Parametern gestartet werden, so für
die Mindestzahl der
Parameter einen * anfügen (im Beispiel also
mindestens zwei Parameter)
www-data
ALL=(ALL) NOPASSWD: /usr/bin/python /usr/test.py * *
3.
Das PHP-Script erstellen
<?php
echo shell_exec("sudo python /usr/test.py");
?>
|
Python-Programm
test.py
|
#
python compiler unter: /usr/bin/python
#
-*- coding: utf-8 -*-
#
Das Programm gibt die ihm übergebenen Parameter aus. Diese
#
erscheinen als Strings und können den Wünschen
entsprechen zu
#
Integer- oder Fließkommazahlen gewandelt und
weiterverarbeitet
#
werden. Der Parameter[0] enthält grundsätzlich ..
#
/Pfad/und/Namen/des/Programms.py
import
sys
#
--------------- # Pgm: main ----------------------------------- #
#
Start: python /usr/test.py
def
main():
n=0
# x enthält die Anzahl der übergebenen Parameter
x =
len(sys.argv)
# solange n kleiner ist als x, die übergebenen Parameter
ausgeben.
while
n < x:
print ("arg%d= %s" %(n,
sys.argv[n]))
n=n+1
# letzte Meldung, zugleich Rückgabeparameter bei php 'exec'
print
'Fertig .. Parameter ausgegeben'
#
benennt main() als Startfunktion
if
__name__=="__main__":
main()
|
PHP-Programm
test.php
|
<?php
//
Dieses php-Programm ruft über 4 verschiedene Wege das
python-
//
Programm 'test.py' auf, welches in dem Verzeichsnis /usr/ ab-
//
gelegt wurde. Dem Programm muß mindestens ein Parameter
übergeben
//
werden, mehr Parameter sind aus unbekannten Gründen möglich.
//
Damit die Aufrufe 1-4 funktionieren, muß in der Datei ..
//
/etc/sudoers.tmp
//
über den Befehl 'visudo', der die Datei mit dem Editor
'nano'
//
öffnet, der Eintrag ..
//
www-data ALL=(ALL) NOPASSWD: /usr/bin/python /usr/test.py *
//
.. vorgenommen werden. In diesem Eintrag kennzeichnet das Zeichen
//
'*' den zu übergebenden Parameter. Wird '*' entfernt, darf
kein
//
Parameter übergeben werden.
//
Welche Vor- bzw. Nachteile die vorgestellten Aufrufe besitzen muß
//
in deren Beschreibungen erkundet werden.
//
-----------------------------------------------------------------
//
Test: Aufruf und Rückgabe der Ausgaben von Systembefehlen.
Sie
//
funktionieren ohne einen Eintrag in /etc/sudoers.tmp
//
Hier als Beispiel der Aufruf von 'date'
echo
'Ausgabe des Datums<BR>';
echo
'<pre>';
system('date');
echo
'</pre><BR>';
//
-----------------------------------------------------------------
//
die Anzahl der Übergabeparameter $dat kann bis auf einen
vermin-
//
dert werden.
$dat1=55.7;
$dat2=202.556;
$dat3='Programm';
$dat4='TEST';
$dateiname='sudo
python /usr/test.py';
//
(überschüssige Übergabeparameter natürlich
auch hier löschen)
$datei
= $dateiname.' '.$dat1.' '. $dat2.' '.$dat3.' '.$dat4;
//
1. system: Aufruf von ausführbaren Dateien.
//
Es werden alle Rückgaben angezeigt
echo
'python programmaufruf mit system<BR>';
echo
'<pre>';
system($datei);
echo
'</pre><BR>';
//
2. passthru: Aufruf von ausführbaren Dateien.
//
Es werden alle Ausgaben angezeigt
echo
'python programmaufruf mit passthru<BR>';
passthru($datei);
//
3. shell_exec: Aufruf von ausführbaren Dateien.
//
Es werden alle Ausgaben zurückgegeben
$shell=shell_exec($datei);
//
4. exec: Aufruf von ausführbaren Dateien.
//
Es wird nur die letzte Ausgabe zurückgegeben
$exec=exec($datei);
//
Rückgaben von shell_exec bzw. exec
//
Sie werden zum Bildschirm ausgegeben
echo
'<BR><BR>Rueckgabe von shell_exec<BR>',$shell;
echo
'<BR><BR>Rueckgabe von exec<BR>',$exec;
?>
|
Anmerkung
|
Bei
der Angabe einer PHP-String-Variablen bei welcher der String
Freizeichen enthält, wird diese im Python-Programm zu
mehreren Übergabewerten ausgewertet. Im obigen Programm
ergäbe die Angabe von $dat3= 'ein Programm'; die Python
Variablen arg3='ein', arg4='Programm' und $dat4='TEST' würde
zu arg5 werden. Grund und Abhilfe konnten bisher nicht geklärt
werden.
|
|
|