Raspberry pi: gegevens van python naar php

Status
Niet open voor verdere reacties.

Holidaybuggy

Gebruiker
Lid geworden
6 jun 2005
Berichten
42
Goedenavond,

Ik probeer gegevens (temperatuur) van een am2302 module in php te krijgen maar het lukt me niet.
Dit werkt niet: (geen output in browser terwijl python script in console wel output geeft)

index.php
PHP:
<?php

$temp = exec('python am2302.py');
echo $temp;

?>

am2302.py
Code:
#!/bin/python

import Adafruit_DHT
humidity,temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 4)

print temperature
print humidity


Het gekke is dat dit wel werkt:

index.php
PHP:
<?php

$temp = exec('python helloworld.py');
echo $temp;

?>

helloworld.py
Code:
#!/usr/bin/env python

temp = 'Hello'
print temp

Kan iemand vertellen wat ik fout doe?
 
Moet de shebang niet altijd
Code:
#!/usr/bin/env python
zijn? zodat het pad altijd gevonden wordt?
 
Bedankt voor je reactie.

Ik heb dat aangepast maar het resultaat blijft hetzelfde.
In php krijg ik geen waarde te zien.
 
Bedankt voor de toevoeging.

Maar dit is denk ik niet het probleem?
Wat ik ook in de 'header' zet, ik krijg in php geen waarde te zien.
 
Laatst bewerkt:
Wel als
PHP:
python2
of
PHP:
python3
als waarde er had moeten staan ipv
PHP:
python
in de code....

Heb je dat ook getest naast dan je het gedacht had?
 
Laatst bewerkt:
Jazeker.

Ik had de Adafruit-DHT alleen voor python2 geïnstalleerd maar ook met Adafruit-DHT geïnstalleerd voor python3.
Maar een output in php krijgen lukt me niet.


index.php
PHP:
<?php

$temp = exec('/usr/bin/python3 /var/www/html/temp/am2302.py');
echo $temp;

?>

am2302.py
Code:
#!/usr/bin/python
import sys
import time
import Adafruit_DHT

humidity,temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 4)

temp = temperature

print (temp)

Als het een rechtenprobleem zou zijn, dan had de "helloWorld.py" toch ook geen output teruggegeven?
 
en als je dit doet
PHP:
<?php
$output = shell_exec('ls /etc');//aangepast volgens onderstaande vraag
echo "IK PROBEER HELLO WORLD EN OOK<pre>$output</pre>";
?>

Beste kijk ook eens naar de rechten van het bestand of je wel mag (het lijkt stom maar ...)
 
Laatst bewerkt:
En zijn die waarden er wel?
Als dat niet goed staat op eoa manier valt er niks op te vragen dus ook niks te laten zien.

Kun je niet iets anders opvragen, want de Hellow World is alleen een soort print test , er zit geen parameter opvraag actie in.
 
als ik het programma uitvoer zoals "kenikavanbis" beschrijft krijg ik keurig de ls te zien...

Code:
IK PROBEER HELLO WORLD EN OOK
X11
adduser.conf
alternatives
apache2
apparmor.d
apt
avahi
bash.bashrc
...

En ja, de waarde's zijn er wel als ik de python code in het console uitvoer.

Verder heb ik alle rechten op het python bestand gezet, zonder resultaat.

Ik heb ondertussen het idee dat het hierin zit:

Code:
import Adafruit_DHT

Zodra ik met php een python script probeer aan te roepen met die regel dan lijkt het erop dat ik daardoor geen output in php krijg.
Of dat vermoeden klopt weet ik niet...
 
Dit komt van iets minder juiste programmeurs maar naar mijn mening zou je bestand in de lijst moeten komen te staan

zoek gaat naar files met SetUID permissions. SUID (Set owner User ID up on execution) is een bijzonder type van file permissions. Wanneer de setuid flag is gezet, dan kan een gebruiker de betreffende bestanden uitvoeren met de rechten van de owner(idealiter:root).
Zoeken naar SUID bestanden op het target met het volgende commando:
Code:
  find / -user root -perm -4000 –exec ls -ldb {}\; >/tmp/setuid.txt
 
Goed punt :cool:. Kijk er apache config file na daar staat in hoe dit geregeld is of juist niet... Bij een webdav in log van een user had ik ook last er van dat de bestanden niet onder www-data kwamen maar in de user home plek.

Edit:
Zie onder wat ik toen gedaan heb. Het had oa te maken met de envvars bestand van Apache.
Of dit de oplossing gaat zijn hier?
Het helpt dan iiig bij de bewustwording van wat er toch mis kan gaan bij Apache....
Bij Debian6 was dit totaal geen probleem, het trad op bij Debian 8. De Apache versie werkt daar blijkbaar net iets anders?
Aan de webdav bestanden hoefde ik imho niks te veranderen.
Ik heb geen upgrade gedaan van Debian 6 naar 8, ik heb een clean install gedaan, juist om "oneffenheden' in de overgang te ontdekken, een upgrade was wellicht eenvoudiger maar dan is het vaak veel minder transparant waar mogelijke toch opgetreden fouten vandaan komen. Nu kon ik ze naast elkaar zetten .... en... zoek de verschillen.... en das gelukt...

�� : via iOS12 .... en Safari.... vandaag gedaan, moest zijn. :cool: (aangepast boven)


Met setuid bit aan de slag geweest, een beetje een deja vue... gevoel, maar uitgerekend dat stuk had ik niet gedocumenteerd, dus telt het niet...

Code:
root@tom-server-1:/data# ls -l
......
drwxrwsr-x 19 syncen www-data 4096 aug 17 19:05 webdav1

yes de s komt er bij staan, vervolgens vanaf een andere pc via een syncen login foto's overgezet..:

Code:
root@tom-server-1:/data/webdav1/2013-08-14-Xanten# ls -l
....
-rw-rw-rw- 1 www-data www-data 1380065 aug 17 19:27 2013-08-14 11-41-08 - 0001.JPG


Helaas dus... het lijkt of Apache dus de setuid bit overruled?
Als dat zo is... dan moet bij een interne kopie wel de setuid zo blijven, dus nu als local syncen een map copyen:
Code:
syncen@tom-server-1:/data/webdav1$ ls -l
....
drwxrwsr-x   3 syncen www-data  4096 aug 16 22:24 2013-08-14-Xanten

en voor het lokaal gecopyde bestand:

Code:
-rwxrwsr-x 1 syncen www-data 1380065 aug 16 22:23 2013-08-14 11-41-08 - 0001.JPG


Yes! de s staat erin en zowel eigenaar als groep zijn ok!

Conclusie: het is een Apache zaak (bug?)
Ik kan dus daar mee verder, maar tips blijven welkom.


Opgelost
Geen bug van Apache.. maar wel inderdaad een regel aanpassen die dus de setuid overruled!
Het gaat inderdaad weer om het envvars bestand.
De default user die alles overruled staat dus in:
/etc/apache2/envvars
Code:
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Die moet je aanpassen naar:
Code:
export APACHE_RUN_USER=gewenste_user
export APACHE_RUN_GROUP=www-data


Als je dan Apache herstart krijg je deze foutmelding:
Code:
 * Restarting web server apache2       ... waiting /var/lock/apache2 already exists but is not a directory owned by "gewenste_user".
Please fix manually. Aborting.

wat niet werkt under root:
Code:
chown -R gewenste_user:gewenste_user /var/lockapache2/

Geen toegang of zo.
Dan maar handmatig via MC (edit: Midnight Commander) de eigenaar van /var/lockapache2/ op gewenste_user gezet en dat werkt na herstarten van Apache wel!

Resultaat na het copyen van mijn pc naar de server:

Code:
root@tom-server-1:/data/webdav1/2013-08-14-Xanten# ls -l
totaal 60932
drwxrwsrwx   3 syncen www-data  4096 aug 16 22:24 2013-08-14-Xanten
-rw-rw-rw- 1 syncen www-data 1296330 aug 16 10:45 2013-08-16 12-11-51 - 0014.JPG

Je ziet dat de map de s nog bevat en nu beiden syncen als eigenaar hebben en www-data als groep.

Wel... waar posten naar 2 jaar toch nog goed voor is om er weer verder in te duiken.

Zoals altijd.... Met de juiste trefwoorden vond ik hem daarna in Google meteen .. :(
http://www.google.nl/#bav=on.2,or.r...apache2+User+${APACHE_RUN_USER}&sa=N&start=20

Hier (vandaag) de 1e hit:
http://bookofzeus.com/articles/change-apache-default-user
met datum: Sunday, May 5, 2013 CDT
vrij recent....

To do:
umask nog weer terug zetten naar 002..
plus nog een paar "foutjes" wegwerken
image maken
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan