Jump to content
php.lv forumi

Kā no php izpildīt shell vai python kodu un iegut atbildi ?


analgins

Recommended Posts

1 hour ago, jurchiks said:

Ehh, grūti ir, kad PHP vispār nezin, bet nez kāpēc grib rakstīt.

Uztaisi tā: cron skripts, kurš izpilda tavu python skriptu un appendo outputu teksta failā (droši vien kopā ar datumu, kuru tā komanda neatgriež, vajadzēs iemācīties, kā shell skriptā izvadīt datumu); web skripts, kurš tikai nolasa to teksta failu.

Ja gribās advancētāk (lasīt: priekš tevis krietni vairāk problēmu), tad var datus saglabāt datubāzē, un tad nevajadzēs visu teksta failu ielādēt, varēs filtrēt.

nu kamon, tas jau vispār pēc kosmosa izklausās, prieškam mysql tur vēl darbināt ?

man tos sensorus jānolasa vienu reizi kad ielādē admina paneli, lai redzētu aktuālos datus, tas arī viss.. bet tu te piedāvā būvēt kosmosa kuģi, lai aizbrauktu pēc piena.. noteikti problēma ir stulbi elementāra, kods jau pats par sevi strādā, jāatrod tik premisiju problēma, ne php, jo konsolē jau visu atgriež korekti..

Paies nedēļa, bet ganjau atkodīšu ko izdarīt, paldies visiem par atsaucību.

Link to comment
Share on other sites

  • Replies 43
  • Created
  • Last Reply

Top Posters In This Topic

tagad apskatījos, man abos RBpi:

/etc/psswd

www-data:x:33:33:www-data:/var/www:/bin/bash

tāpēc arī (iespējams) nav problēmu ar .py komandas izvades rādīšanu. skaidrs, ka "tā nav labi", bet manas iekārtas nav pieejamas no ārpuses

sapratu, kas manā gadījumā tam 'www-data' iedeva šellu, 'RPi_Cam_Web_Interface', tāda kameras interfeisa vadības programma

 

Edited by ieleja
Link to comment
Share on other sites

Es teicu "ja gribās advancētāk", nevis obligāti datubāzes. Lasīt vajag iemācīties. Tu teici, ka gribi realtime statistiku, nu tad taisi cron skriptu, kas reizi 30 sec ielādē aktuālos datus un saglabā vienalga kur, un no turienes arī nolasi web lapā. Ja saglabāsi failu ar pareizajām permissions, tad web pusē vispār nekādu problēmu nebūs, bet tagad tu jau 3 dienas pisies ar kaut ko, ko pa manam varēja uztaisīt stundas laikā.

Ja tev vajag tikai pēdējo ierakstu un nevajag vēsturi, tad ar failu pilnībā pietiek - overwrite content un viss.

Edited by jurchiks
Link to comment
Share on other sites

2 hours ago, jurchiks said:

Ehh, grūti ir, kad PHP vispār nezin, bet nez kāpēc grib rakstīt.

Uztaisi tā: cron skripts, kurš izpilda tavu python skriptu un appendo outputu teksta failā (droši vien kopā ar datumu, kuru tā komanda neatgriež, vajadzēs iemācīties, kā shell skriptā izvadīt datumu); web skripts, kurš tikai nolasa to teksta failu.

Ja gribās advancētāk (lasīt: priekš tevis krietni vairāk problēmu), tad var datus saglabāt datubāzē, un tad nevajadzēs visu teksta failu ielādēt, varēs filtrēt.

nu kamon.. tu tagad iesaki būvēt kosmosakuģi lai brauktu uz veikala pēc piena..

skaidrs kā diena, ka php kodā nav problēma, bet gan paša debiana premisijās, tāpēc www-data nevar izpildīt konkrēto skriptu.. 

 

Mēģināšu samainīt /sbin/nologin uz /sbin/bash redzēs ko tas dos

Link to comment
Share on other sites

ar komandu sudo chsh www-data nomainiju no /usr/sbin/nologin uz /bin/bash - reboots - izdruka no konsoles

pi@raspberrypi:~ $ sudo -u www-data php /var/www/html/python.php
[sudo] password for www-data: 
Sorry, user www-data is not allowed to execute '/usr/bin/python /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12' as root on raspberrypi.
exite code is: 1
array(0) {
}
Array
(
)
<hr><hr>Python 2.7.9
rrwxrwxrwx

to pašu pēctam izdarīju tik norādīju /usr/bin/python reboots un konsolē rāda to pašu...

liekas ļoti interesanti ka tai pat laikā, lietotājs pi ar /bin/bash bez sudo var izpildīt šo pašu komandu un atgriež korektu saturu

Link to comment
Share on other sites

BINGO!

Dāmas un Kungi, liels paldies par atsaucību, problēma tika atrisināta!

 

shell nomainiju atpakaļ uz orģinālo /usr/sbin/nologin

/etc/sudoers izlaboju uz šādu 

www-data ALL=(ALL) NOPASSWD:  /usr/bin/python, /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py

 

www-data ALL=(ALL) NOPASSWD:  /usr/bin/python, /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py

 

www-data ALL=(ALL) NOPASSWD:  /usr/bin/python, /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py

 

www-data ALL=(ALL) NOPASSWD:  /usr/bin/python, /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py

visticamāk, uz konkrēto skriptu varēju arī nenorādīt, to vēl neesmu pārbaudījis..

tas ko man patreiz atgriež webs ir šāds, būs jāuzskaistina un jaiekļauj tur kur man to vajag..

exite code is: 0 array(1) { [0]=> string(26) "Temp=20.1* Humidity=40.1%" } Temp=20.1* Humidity=40.1% Array ( [0] => Temp=20.1* Humidity=40.1% )
rrwxrwxrwx

 

Link to comment
Share on other sites

Tu teici, ka gribi realtime statistiku, nu tad taisi cron skriptu, kas reizi 30 sec ielādē aktuālos datus

Tas ir tieši pretēji real-time datiem - ik pēc 30 sekundēm pollot datus. ;D Izklausās ka nesaproti ko runā; un pa vidu bezsakarā likt file caching - nafig?

Link to comment
Share on other sites

3 hours ago, analgins said:

 


www-data ALL=(ALL) NOPASSWD:  /usr/bin/python, /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py

visticamāk, uz konkrēto skriptu varēju arī nenorādīt, to vēl neesmu pārbaudījis..

Šobrīd tu esi atļāvis www-data izpildīt sudo python, kas no drošības viedokla nav diezko labi (protams, ja uz kastes nav citu lietotāju, kā arī nav publiska, tad pofig), bet nu ideja ir apmēram tāda, ka šadi www-data var palaist python, kas savukārt var izpildīt jebko ar root permisijām:

sudo python -c 'import os;os.system("ls -la")'

(drošības labad, lai kāds nepamēģina, nerakstīju 'rm -rf /')

Attiecīgi nedaudz labāk būtu, ja nodzēstu to komatu starpā, bet šo parasti risina vai nu sudoers taisot Cmd_aliasus vai arī piemēram uztaisot .sh skriptu, kas satur konkrēto komandu un kuram ir tikai read/exec bet ne write tiesības konkrētajam lietotājam.

Link to comment
Share on other sites

54 minutes ago, daGrevis said:

Tu teici, ka gribi realtime statistiku, nu tad taisi cron skriptu, kas reizi 30 sec ielādē aktuālos datus

Tas ir tieši pretēji real-time datiem - ik pēc 30 sekundēm pollot datus. ;D Izklausās ka nesaproti ko runā; un pa vidu bezsakarā likt file caching - nafig?

Liec kaut reizi sekundē, bet viņa vajadzībām biežāk nevajag.

File caching šajā gadījumā ļautu apiet permissions problēmu, in case you're dumb and didn't get that.

Edited by jurchiks
Link to comment
Share on other sites

6 hours ago, Roze said:

Šobrīd tu esi atļāvis www-data izpildīt sudo python, kas no drošības viedokla nav diezko labi (protams, ja uz kastes nav citu lietotāju, kā arī nav publiska, tad pofig), bet nu ideja ir apmēram tāda, ka šadi www-data var palaist python, kas savukārt var izpildīt jebko ar root permisijām:


sudo python -c 'import os;os.system("ls -la")'

(drošības labad, lai kāds nepamēģina, nerakstīju 'rm -rf /')

Attiecīgi nedaudz labāk būtu, ja nodzēstu to komatu starpā, bet šo parasti risina vai nu sudoers taisot Cmd_aliasus vai arī piemēram uztaisot .sh skriptu, kas satur konkrēto komandu un kuram ir tikai read/exec bet ne write tiesības konkrētajam lietotājam.

Taisot sh skriptu, Tu biji domājis, ka to izpilda piemēram kā lietotājs pi un tad www-data novāc atgrieztos datus, pareizi sapratu ?

Link to comment
Share on other sites

11 hours ago, analgins said:

Taisot sh skriptu, Tu biji domājis, ka to izpilda piemēram kā lietotājs pi un tad www-data novāc atgrieztos datus, pareizi sapratu ?

Nē es to biju domājis tā - pretēji tam, lai dotu tiesības uz 'python', kas principā ļauj caur valodu/interpretatoru darbināt jebko citu ar root privilēģijam, to dara apmēram šādi:
1. Uztaisa shell skriptu blabla.sh, kurā ir iekšā 'python tavsvails.py' (faktiski shellskripta vietā var izmantot arī pašu .py failu, ja viņam sākumā norāda caur ko tas jādarbina (piem. #!/usr/bin/python))
2.  Pārliecinās, ka konkrētajam lietotājam nav rakstīšanas tiesības failā (visvienkāršāk, piemēram, ir izveidot (vai nomainīt) ar root lietotāja un uzlikt chmod 700)
3. sudoers failā ieliek tikai šo .sh vai .py skriptu, tādējādi nav īpaši tālāk jādomā vai konkrētais lietotājs tīši vai netīši spēj palaist kaut ko vēl, kas viņam nepienākas ..

Šis protams vairāk būtiski kaut kādās vairāklietotāju vidēs, bez tam mūsdienās modernāka pieeja ir darbināt šādas "aplikācijas" virtualizēt izolētos konteineros, piemēram, docker, LXC u.c. kur tu vari mierigi aplikāciju darbināt procesus kaut vai zem root lietotāja īpaši neiespringstot, ka tie var ietekmēt pamatsistēmu (protams, tur atkal iespējamas citas ķeskas ar tiešu piekļuvi hardwarei (šajā gadījumā sensoriem)). Vārdu sakot, tikai pārdomas par tēmu ..

 

p.s. es piekrītu arī šeit izteiktajam viedoklim ka Tavā gadījumā būtu labāk:

1. darbināt to skriptu no tā paša 'pi' lietotāja un izvades datus vienkārši ierakstīt kādā teksta failā - ja pietiek, ka tas updeitojas ne biežāk kā 1x minūtē, tad var caur cron, ja vajag biežāk, tad var palaist fonā (./skripts.sh &) vienkārši bash skriptu ar while loopu un sleep timeoutu, piem.:

#!/bin/bash
while [ 1 ]; do
	sudo python /home/pi/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12 > /var/www/sensor.txt
	sleep 5
done


2. No php lasīt tikai konkreto teksta failu

Tādējādi nebūs nepieciešams ņemties un dot apaches lietotājam kaut kādus sudo utt, kā arī var labāk kontrolēt piekļuvi sensor datiem/atmiņai utt, proti nav iespējams variants ka atver http lapu, uzliek pirkstu uz F5 un Pi nokaras tāpēc, ka dzīvajā palaisti ziljons sudo python skripti, kas visi mēģina bakstīt sensoru.

 

Link to comment
Share on other sites

3 hours ago, Roze said:

Nē es to biju domājis tā - pretēji tam, lai dotu tiesības uz 'python', kas principā ļauj caur valodu/interpretatoru darbināt jebko citu ar root privilēģijam, to dara apmēram šādi:
1. Uztaisa shell skriptu blabla.sh, kurā ir iekšā 'python tavsvails.py' (faktiski shellskripta vietā var izmantot arī pašu .py failu, ja viņam sākumā norāda caur ko tas jādarbina (piem. #!/usr/bin/python))
2.  Pārliecinās, ka konkrētajam lietotājam nav rakstīšanas tiesības failā (visvienkāršāk, piemēram, ir izveidot (vai nomainīt) ar root lietotāja un uzlikt chmod 700)
3. sudoers failā ieliek tikai šo .sh vai .py skriptu, tādējādi nav īpaši tālāk jādomā vai konkrētais lietotājs tīši vai netīši spēj palaist kaut ko vēl, kas viņam nepienākas ..

Šis protams vairāk būtiski kaut kādās vairāklietotāju vidēs, bez tam mūsdienās modernāka pieeja ir darbināt šādas "aplikācijas" virtualizēt izolētos konteineros, piemēram, docker, LXC u.c. kur tu vari mierigi aplikāciju darbināt procesus kaut vai zem root lietotāja īpaši neiespringstot, ka tie var ietekmēt pamatsistēmu (protams, tur atkal iespējamas citas ķeskas ar tiešu piekļuvi hardwarei (šajā gadījumā sensoriem)). Vārdu sakot, tikai pārdomas par tēmu ..

 

p.s. es piekrītu arī šeit izteiktajam viedoklim ka Tavā gadījumā būtu labāk:

1. darbināt to skriptu no tā paša 'pi' lietotāja un izvades datus vienkārši ierakstīt kādā teksta failā - ja pietiek, ka tas updeitojas ne biežāk kā 1x minūtē, tad var caur cron, ja vajag biežāk, tad var palaist fonā (./skripts.sh &) vienkārši bash skriptu ar while loopu un sleep timeoutu, piem.:


#!/bin/bash
while [ 1 ]; do
	sudo python /home/pi/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12 > /var/www/sensor.txt
	sleep 5
done


2. No php lasīt tikai konkreto teksta failu

Tādējādi nebūs nepieciešams ņemties un dot apaches lietotājam kaut kādus sudo utt, kā arī var labāk kontrolēt piekļuvi sensor datiem/atmiņai utt, proti nav iespējams variants ka atver http lapu, uzliek pirkstu uz F5 un Pi nokaras tāpēc, ka dzīvajā palaisti ziljons sudo python skripti, kas visi mēģina bakstīt sensoru.

 

patiesībā, mana pati pirmā doma bija kaut kas līdzīgs rakstīšanai failā..

 

long story short, ir py skripts kas dara sekojošas lietas

1) vāc datus no sensoriem, raksta tos Round Robin Database iekšā šo visu, šis cikls atkārtojas ar minutes intervālu

2) lasa config.ini kurā no php es ievadu mainīgos un py skripts rīkojas atbilstoši un saslēdz vai atslēdz relejus

mana problēma pirmajā momentā bija tāda ka nevarēju atrast normālu veidu kā ierakst'tit konkrētās vērtības vienā failā  (vienā, jo man nepatīk bardaks ar failiem), līdz ar to radas doma to izpildīt dzīvajā..

Realitātē, tagad ir radies sava veida pārbaude sensoriem, jo esošais skripts, mēģinot nolasīt sensorus - ja tas izdodas viss ok, bet ja neizdodas nolasīt kādu no sensoriem, skripts tiek apturēts pavisam.. Tad tagad ir iespēja pa tiešo bez python skriptiem paskatīties vai visi sensori atbild un izvada vērtības, kas būtu pagrūti, ja tie tiktu lasīti failā

Kā novērst šo nepilnību un turpināt python koda izpildi arī pēc tam kad kāds no sensoriem nav ticis nolasīts man ir aizdomdas.. ganjau safixēšu..

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...