Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie

[PHP] exec()

Pagina: 1
Acties:

Vraag


  • Steven-b
  • Registratie: december 2012
  • Laatst online: 15-06 13:08
(jarig!)
Hoi allen,

Voor m'n "learning curve" ben ik tegenwoordig wat aan het prutsen in PHP, uiteraard stoot ik hier dan ook op een probleem waar ik niet uit lijk te komen... of ik zie het gewoonweg niet :)

via PHP voer ik het volgende commando uit naar een linux (CentOS 7.5) shell:

exec('sudo zpool create ZPOOL00 mirror sdb sdc');

Voor degene onder ons die ZFS in command line uitvoeren zullen dit wel herkennen :)
Het commando wordt uitgevoerd, maar het lijkt ergens te "hangen" en ik vind zelf niet meteen waarom.
Ik denk dat het ligt aan het feit dat dit specifieke commando geen output genereert...

Indien het commando rechtstreeks op een terminal wordt uitgevoerdt stellen er zich geen problemen bv:

zpool destroy ZPOOL00 werkt dan zonder enig probleem.

Heb ik het commando via PHP uitgevoerd krijg ik de melding dat de pool bezig is... en dit blijft maar duren.
de enige manier om dit op te lossen is een reboot of het herstarten van de httpd (Apache) service.

Ik heb reeds verschillende manieren geprobeerd die ik vond via google maar tot nu toe zat er niet echt een voltreffer tussen.


Mvg,
Steven

Alle reacties


  • RobIII
  • Registratie: december 2001
  • Laatst online: 21:10

RobIII

Moderator Devschuur®

^ Romeinse 3 ja!

quote:
Steven-b schreef op vrijdag 15 juni 2018 @ 02:01:
Ik heb reeds verschillende manieren geprobeerd die ik vond via google maar tot nu toe zat er niet echt een voltreffer tussen.
Uit onze Quickstart:
quote:
6. Geef daarna aan wat je al geprobeerd hebt om zelf tot een oplossing te komen.
Een duidelijke omschrijving geven van dingen die je al geprobeerd hebt voorkomt ook dat mensen tips geven die voor jou oude koek zijn. Dat houdt ook in dat je aangeeft waarop je gezocht hebt (met welke keywords), wat je gevonden hebt en waarom het gevondene niet voldeed.
Verder: Heeft de user waaronder je het commando uitvoert wel de juiste rechten? En heb je al gedebugged? Wat kwam daar uit?

Flat earth is not theory, it is a diagnosis.

Over mij


Acties:
  • +5Henk 'm!

  • Reptile209
  • Registratie: juni 2001
  • Laatst online: 21:04

Reptile209

- gers -

Zit PHP niet gewoon te wachten (eindeloos) totdat iemand het sudo-wachtwoord invoert? ;)

Zie bijvoorbeeld dit voor oplossingen om sudo in exec() te laten werken, en waarom dat een slecht plan is. :+

Reptile209 wijzigde deze reactie 15-06-2018 06:38 (59%)

Professor Farnsworth: "Good news everyone! I've invented a signature which makes you read this line in your head, in my voice!"


Acties:
  • +1Henk 'm!

  • RobIII
  • Registratie: december 2001
  • Laatst online: 21:10

RobIII

Moderator Devschuur®

^ Romeinse 3 ja!

quote:
Reptile209 schreef op vrijdag 15 juni 2018 @ 06:33:
Zit PHP niet gewoon te wachten (eindeloos) totdat iemand het sudo-wachtwoord invoert? ;)
Scherp! Die had ik gemist! :D

Flat earth is not theory, it is a diagnosis.

Over mij

quote:
Reptile209 schreef op vrijdag 15 juni 2018 @ 06:33:
en waarom dat een slecht plan is. :+
Iets beter: http://php.net/proc_open ;)

Maar eigenlijk zou een script nooit iets als root moeten proberen.
Hoogstens via PHP CLI met user input:
PHP:
1
2
echo "\nType your sudo password: ";
$response = trim(fgets(STDIN));

DJMaze wijzigde deze reactie 15-06-2018 10:00 (40%)

Maak je niet druk, dat doet de compressor maar


  • Steven-b
  • Registratie: december 2012
  • Laatst online: 15-06 13:08
(jarig!)
Neen, hij zit niet eindeloos te wachten op het sudo ww :) 100% zeker en het commando wordt uitgevoerd als de root user -> ook al is dit geen goed idee zoals hierboven aangehaald dit is puur een test om te kijken of het kan.

m.a.w. de pool wordt effectief aangemaakt.

Wat ik bedoelde met verschillende zaken al geprobeerd zijn exec, shell_exec, system, passthru telkens geven ze hetzelfde resultaat, heb ook al een bash script gemaakt en dit dan aangesproken door argumenten door te geven maar ook hier weer hetzelfde resultaat.

Het lijkt erop dat als ik het commando uitvoer via PHP op eender welke manier (exec, shell_exec, ...) dat het process uitgevoerd wordt maar niet beëindigd wordt.

Het vreemde is ik heb dit niet met andere commando's, het verschil is wel dat die commands wel output kunnen genereren.

Ik was misschien aan het denken/overwegen om python erbij te halen maar ik ben niet zeker of dit wel een oplossing biedt.

Steven-b wijzigde deze reactie 15-06-2018 10:42 (17%)


Acties:
  • +1Henk 'm!

  • ocwil
  • Registratie: mei 2007
  • Laatst online: 06-08 15:00
https://stackoverflow.com...snt-continue-to-next-line

volgens deze link moet je de output naar iets pipen ook al is er geen output.
zie ook de comment op het antwoord.
quote:
Just a comment in case someone else has the problem I did. You have to both pipe the output to a file as well as the appended "&". If you don't pipe the output, it will hang. Just pipe to /dev/null if you don't care about it.

~ Portal 2 maps: linkje ~ LoL (EUW): Ocwil ~


  • Steven-b
  • Registratie: december 2012
  • Laatst online: 15-06 13:08
(jarig!)
quote:
ocwil schreef op vrijdag 15 juni 2018 @ 10:42:
https://stackoverflow.com...snt-continue-to-next-line

volgens deze link moet je de output naar iets pipen ook al is er geen output.
zie ook de comment op het antwoord.


[...]
Net even getest:

exec('sudo zpool create ZPOOL00 mirror sdb sdc >> /tmp/log_file.log 2>&1 &');

Biedt geen oplossing, helaas :)

EDIT:

Elders tijdens het googlen las ik over $output en $exitcode met dat soort code:

$output = '';
$exitcode = 0;
exec('sudo zpool create ZPOOL00 mirror sdb sdc >> /tmp/log_file.log 2>&1 &', $output, $exitcode);

Voert het uit maar ik zou denken aan de hand van exitcode dat hij dit automatisch sluit, dit is echter niet zo.

Steven-b wijzigde deze reactie 15-06-2018 10:52 (26%)

Logisch, je kan dit namelijk helemaal niet (zomaar) via httpd doen.
PHP/Apache wacht dan namelijk totdat alle sub-processen zijn gestopt, en dat gebeurt niet.
Je moet uit het Apache proces breken: nohup

SSH bash/ash/etc. precies het zelfde probleem ;)

DJMaze wijzigde deze reactie 15-06-2018 12:07 (12%)

Maak je niet druk, dat doet de compressor maar


  • Steven-b
  • Registratie: december 2012
  • Laatst online: 15-06 13:08
(jarig!)
quote:
DJMaze schreef op vrijdag 15 juni 2018 @ 12:00:
Logisch, je kan dit namelijk helemaal niet (zomaar) via httpd doen.
PHP/Apache wacht dan namelijk totdat alle sub-processen zijn gestopt, en dat gebeurt niet.
Je moet uit het Apache proces breken: nohup

SSH bash/ash/etc. precies het zelfde probleem ;)
Wel, even gekeken met onderstaand commando:

exec('sudo /usr/bin/nohup zpool create ZPOOL00 mirror sdb sdc >/dev/null 2>&1 &');

ik denk dat dit ok is? maar ben niet zeker...
De pool werd ook hier wel weer aangemaakt, maar zelfde resultaat is bezet en kan er niets mee doen.

PHP:
1
shell_exec('sudo /usr/bin/nohup zpool create ZPOOL00 mirror sdb sdc > /dev/null 2>/dev/null & echo $! >> /tmp/zpool00.pid');

al geprobeerd?

En verder gaf ik natuurlijk al een verwijzing naar proc_open()....

DJMaze wijzigde deze reactie 15-06-2018 12:39 (27%)

Maak je niet druk, dat doet de compressor maar


  • Steven-b
  • Registratie: december 2012
  • Laatst online: 15-06 13:08
(jarig!)
quote:
DJMaze schreef op vrijdag 15 juni 2018 @ 12:34:
PHP:
1
shell_exec('sudo /usr/bin/nohup zpool create ZPOOL00 mirror sdb sdc > /dev/null 2>/dev/null & echo $! >> /tmp/zpool.pid');

al geprobeerd?
Net gedaan :), zelfde resultaat
Thx voor je snelle response :)

  • raxon
  • Registratie: maart 2003
  • Laatst online: 07-08 15:38
doe is var_dump($output) de output van exec($cmd, $output)

RaXon

@Steven-b oh ja, CentOS... welkom in de wereld van SELinux :)
PHP:
1
proc_close(proc_open('sudo /usr/bin/nohup zpool create ZPOOL00 mirror sdb sdc > /dev/null 2>/dev/null & echo $! >> /tmp/zpool00.pid', array(), $dummy));

Vergeet niet met PS de /tmp/zpool00.pid te controleren. Je wil het immers niet 50 keer opstarten via je webbrowser :p

Nou weet je waarom.... davitamon.... The red pill...

DJMaze wijzigde deze reactie 15-06-2018 12:46 (28%)

Maak je niet druk, dat doet de compressor maar


  • Steven-b
  • Registratie: december 2012
  • Laatst online: 15-06 13:08
(jarig!)
quote:
DJMaze schreef op vrijdag 15 juni 2018 @ 12:42:
@Steven-b oh ja, CentOS... welkom in de wereld van SELinux :)
PHP:
1
proc_close(proc_open('sudo /usr/bin/nohup zpool create ZPOOL00 mirror sdb sdc > /dev/null 2>/dev/null & echo $! >> /tmp/zpool00.pid', array(), $dummy));

Vergeet niet met PS de /tmp/zpool00.pid te controleren. Je wil het immers niet 50 keer opstarten via je webbrowser :p

Nou weet je waarom.... davitamon.... The red pill...
Hehe, ja ik kan er opzich m'n plan wel mee trekken maar nu kom ik er toch echt niet alleen uit :)
SELinux staat disabled trouwens, ik heb daar eens problemen mee gehad toen ik wat aan't klooien was met DRBD, sindsdien disable ik deze standaard als ik wat wil gaan rondklooien :)
Dat terzijde...

de /tmp/zpool00.pid ?
Sorry, ik ben geen Linux held :D

  • Steven-b
  • Registratie: december 2012
  • Laatst online: 15-06 13:08
(jarig!)
quote:
raxon schreef op vrijdag 15 juni 2018 @ 12:40:
doe is var_dump($output) de output van exec($cmd, $output)
de output hiervan zou zijn:
NULL string(0)

  • Barreljan
  • Registratie: december 2001
  • Laatst online: 18-08 22:40

Barreljan

...Zoom-Zoom...

Is het niet een php-fpm die dit blokkeert? Of draai je gewoon zonder deze?

even kijken in de /etc/php-fpm.d/ en waarschijnlijk www.conf aldaar

#php_admin_value[disable_functions] = passthru,shell_exec,system
php_admin_value[disable_functions] = passthru,system

en voor de bevestiging even kijken in
/var/log/php-fpm/error.log (als die daar staat) :)

Specs pjoeter
Time Attacker met de Mazda 323F 2.5 V6 J-spec | daily Mazda3 TS+ '16

Pagina: 1


Call of Duty: Black Ops 4 HTC U12+ dual sim LG W7 Google Pixel 3 XL OnePlus 6 Battlefield V Samsung Galaxy S9 Dual Sim Google Pixel 3

Tweakers vormt samen met Tweakers Elect, Hardware.Info, Autotrack, Nationale Vacaturebank en Intermediair de Persgroep Online Services B.V.
Alle rechten voorbehouden © 1998 - 2018 Hosting door True