Jump to content
php.lv forumi

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


analgins

Recommended Posts

Kā jau iepriekš minēts, 126 exit status ir nepietiekamas permisijas ..

Zem kāda lietotāja darbojas php (ja tiek vērta lapa caur http/webserveri)?
Vai no komandrindas 'php konkretaisfails.php' ar neko neizdod?

Proti, parasti noklusēti 'sudo' komanda pieprasa ievadīt root lietotāja paroli, ja vien nav specifiski nokonfigurēts (konfigurācija parasti /etc/sudoers), ka konkrēti sistēmas lietotāji to var izsaukt bez paroles ievades, taču, ja php darbojas zem cita lietotāja, iespējams tam nav šādu permisiju.

 

Kā alternatīvu varētu skatīties vai nav iespējams atjaunināt pašu Raspberry programmatūru (neesmu gan lietojis Pi, attiecīgi nemāku teikt cik grūti/vienkārši tas izdarāms), jo tā fiksi pameklējot webā parādās šāda lieta  https://github.com/adafruit/Adafruit_Python_DHT/commit/0db54b0482f004e0091e48cefa9b5f0b310d735b#diff-1da2860702a0965f5f60c13795e0bddf proti iespēja lasīt datus bez root tiesībām.

Link to comment
Share on other sites

  • Replies 43
  • Created
  • Last Reply

Top Posters In This Topic

hmm interesanti..

apachis strādā zem lietotāja www-data, raspbians ir pārkompilēts debians un tam apdeiti sistēmai nāk diezgan regulāri..

nolaboju kodu, pēc ielejas piemēra, verot vaļā webu, parādās tukša lapa, bet no konsoles izpildot php python.php man atgrieza vērtības korektas..

 

<?php

$out = array();

$command = 'python /home/pi/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12';

#$command = 'python /var/www/html/python.sh';

echo exec($command, $out, $status);

foreach($out as $outputStr)

    echo $outputStr . "\n";

?>

 

<?php
$out = array();
$command = 'python /home/pi/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12';
echo exec($command, $out, $status);
foreach($out as $outputStr)
    echo $outputStr . "\n";
?>

šāds bija izvads konsolē

pi@raspberrypi:~ $ php /var/www/html/python.php 
Temp=19.8*  Humidity=32.6%Temp=19.8*  Humidity=32.6%

iespējams ka arī www-data nav tiesības izpildīt to skriptu ar root tiesībām, par to nebiju aizdomājies..

Link to comment
Share on other sites

šo to jau lasījis esmu, tā jau nav ka tikai ar acīm pārbraucu pāri, bet ja konkrētā lieta neizraisa nekādu saprotamu loģiku, tad to infu vienkārši neuzsūcu..

exite code is: 1 NULL

tas no weba, bet ko tas man dod ? forši jau ir, errors parādās, bet kāpēc ? pat zvaniņš nenoskan kāpēc :(

Rīt pamurgošu, kā to kodu palaist bez root tiesībām, tad jau redzēsim vai tur tas suns aprakts..

 

Paldies par atsaucību!!

Link to comment
Share on other sites

4 hours ago, analgins said:

Iespējams ka arī www-data nav tiesības izpildīt to skriptu ar root tiesībām, par to nebiju aizdomājies..

Tev tas skripts atrodas 

/home/pi/Adafruit_Python_DHT/examples/AdafruitDHT.py

kas ir 'pi' lietotāja home direktorija .. parasti noklusētās permisijas neļauj citiem lietotājiem (kas šajā gadījumā ir www-data) piekļuvi /home/ direktorijām.

Pamēģini pārcelt to Adatafruit_Python_DHT kaut kur ārpuse /home (piem /tmp /opt utt) kur būtu read/exec tiesības www-data (vai arī visiem sistēmas lietotājiem).

 

p.s. no testēšanas viedokļa, manuprat, exec() vietā vienkāršāk ir lietot passthru() ( http://lv.php.net/passthru ), kas uzreiz izgrūž komandas outputu.

Link to comment
Share on other sites

Skan kaut kā jocīgi, ka tā ir tikai vienīgā vieta kur iespējams ielikt python skriptu, bet nu labi ..

Bet pa lielam tev tad jāmaina permisijas (proti vai nu /home/pi dot pilnas read/exec tiesības visiem sistēmas lietotājiem (chmod a+rx /home/pi) vai arī jāliek www-data un pi vienā grupā un tad jāmaina grupas permisijas) vai arī teiksim var darbināt apache zem 'pi'  lietotāja.

Vai arī jāskatās /etc/sudoers un jāļauj www-data lietot sudo komandu.

Piemēram var kaut ko šadu:
www-data ALL = NOPASSWD:   /var/www/html/python.sh

attiecīgi ļaujot www-data izpildīt sudo /var/www/html/python.sh bez root pw ievadīšanas ..

Link to comment
Share on other sites

izskatās ka ar pārinstalēšanu citā folderī (/var/www) arī neko nav devis, redzkur kods un ko tas man atgriež..

 


<?php
$out = array();
$command = 'sudo python /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12';
exec($command, $out, $exitCode);
echo 'exite code is: ', $exitCode, PHP_EOL;
var_dump($out);
foreach($out as $outputStr)
    echo $outputStr . "\n";

?>
pi@raspberrypi:/var/www/html $ php python.php 
exite code is: 0
array(1) {
  [0]=>
  string(26) "Temp=19.8*  Humidity=36.0%"
}
Temp=19.8*  Humidity=36.0%

webs atgriež tikai šo 

exite code is: 1 array(0) { }

echo $out; izvada tikai - Array

Vai tas joprojām nozīmē, ka apachim nav tiesības izpildīt šo python skriptu ?

Link to comment
Share on other sites

pieliku www-data pie sudoers, bez izmaiņām

www-data ALL=(ALL:ALL) NOPASSWD: /var/www/Adafruit_Python_DHT/examples

pamēģināju uzlikt python skriptam chmod 777, ar php to arī nolasīju rwxrwxrwx, bet no weba joprojām atgriež errorcode 1

arī pamēģināju palaist komandu caur shell_exec ar password faili kā ir minēts augstāk minētajā linkā (zintis8789)

Konsole atgriež visu korekti, webs neko.. rodas baigā sajūta, ka es te savā sulā kaut ko uz riņķi griežu un kaut ko ļoti svarīgu palaižu garām..

Link to comment
Share on other sites

52 minutes ago, analgins said:

pieliku www-data pie sudoers, bez izmaiņām

www-data ALL=(ALL:ALL) NOPASSWD: /var/www/Adafruit_Python_DHT/examples

Šāda konfigurācija manuprāt neko nedod (ja vien nav nepilnīgi iekopēta), jo nenorāda komandu(-as), kuras ļauts izpildīt. Varbūt testiem tad var ielikt vienkārši:
www-data ALL=(ALL) NOPASSWD: ALL

kas ļautu www-data izpildīt caur sudo jebko (nav īpaši labi no drošības viedokļa, bet to var pēc tam mainit brīdī ja vispār kaut kas sāk darboties).

 

Quote

rodas baigā sajūta, ka es te savā sulā kaut ko uz riņķi griežu un kaut ko ļoti svarīgu palaižu garām..

Nu varbūt tad jāsāk ar vienkāršākām lietām, piemēram, skatīties vai php var palaist pythonu vispār (jāņem vērā ka www-data var būt noshell lietotājs (var noskaidrot paskatoties /etc/passwd vai nav kaut kāds /sbin/nologin vai /bin/false vai arī no root lietotāja izpildot 'su www-data'), kam nav definēti PATH utt)

Piemēram, vai izpildās no weba php ar kaut ko šādu?
<?php passthru('python --version'); ?>

Ja nē, tad nepieciešams pilns path uz python executabli.


Tad var pamēģināt patestēt vienkārši no konsoles vai zem www-data iespējams izpildīt :
su www-data -c "python /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12"
vai 
sudo -u www-data python /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 1

utt

Link to comment
Share on other sites

passthru webā neko neparāda, bet konsolē gan..

Python 2.7.9

root@raspberrypi:/var/www/html# su www-data -c "python /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12"
This account is currently not available.
root@raspberrypi:/var/www/html# sudo -u www-data python /var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12
Traceback (most recent call last):
  File "/var/www/Adafruit_Python_DHT/examples/AdafruitDHT.py", line 41, in <module>
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/common.py", line 90, in read_retry
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/common.py", line 76, in read
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/common.py", line 51, in get_platform
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/Raspberry_Pi_2.py", line 22, in <module>
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/Raspberry_Pi_2_Driver.py", line 7, in <module>
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/Raspberry_Pi_2_Driver.py", line 4, in __bootstrap__
  File "/usr/local/lib/python2.7/dist-packages/setuptools-4.0.1-py2.7.egg/pkg_resources.py", line 950, in resource_filename
    
  File "/usr/local/lib/python2.7/dist-packages/setuptools-4.0.1-py2.7.egg/pkg_resources.py", line 1620, in get_resource_filename
    # usable with the zipimport directory cache for our target archive
  File "/usr/local/lib/python2.7/dist-packages/setuptools-4.0.1-py2.7.egg/pkg_resources.py", line 1650, in _extract_resource
    for name in eagers:
  File "/usr/local/lib/python2.7/dist-packages/setuptools-4.0.1-py2.7.egg/pkg_resources.py", line 1016, in get_cache_path
    target_path = os.path.join(extract_path, archive_name+'-tmp', *names)
  File "/usr/local/lib/python2.7/dist-packages/setuptools-4.0.1-py2.7.egg/pkg_resources.py", line 996, in extraction_error
    )
pkg_resources.ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

  [Errno 13] Permission denied: '/var/www/.python-eggs'

The Python egg cache directory is currently set to:

  /var/www/.python-eggs

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

no /etc/passwd

www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

uz ko vajadzētu mainīt nologin, bash ?

Edited by analgins
Link to comment
Share on other sites

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.

Edited by jurchiks
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...