Interactieve linux commando's met php

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 194637

Topicstarter
Weet er iemand een oplossing om interactieve linux commando's uit te voeren vanuit een php script.
Bijvoorbeeld, je hebt een programmatje die je uitvoert en dan input van de gebruiker vraagt. Kan deze vraag om input in het php script getoond worden en dat je dan input geeft. Daarna heeft het programma weer een 'vraag' en die wordt dan op het scherm getoond. Het uitvoeren van gewonen commando's lukt wel met deze interactieve commando's weet ik geen raad.

Heeft er hier iemand ervaring mee of oplossingen hiervoor. Weet iemand ook of dit uberhaupt kan met php?

Acties:
  • 0 Henk 'm!

  • ErikCornelissen
  • Registratie: Mei 2003
  • Laatst online: 16-06 22:43
misschien zit ik heel raar te denken, maar zou dat niet heel onveilig zijn als je zomaar commando's kan uitvoeren vanaf een site?!

Acties:
  • 0 Henk 'm!

Anoniem: 194637

Topicstarter
Dat klopt maar ik wil alleen maar weten of het uberhaupt zou kunnen en zo ja hoe. Zelf weet ik geen manier. Gewone commando's kun je wel uitvoeren vanuit een php script. Dat is me wel bekend hoe dat moet. Ook dat je met een pipe een soort shell in php kunt 'krijgen'. Vanuit deze shell kun je alles uitvoeren behalve dit soort commando's

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Bedoel je input in PHP-CLI scripts? Dat gaat zo:
PHP:
1
2
3
print("Vul je naam in: ");
$name = fgets(STDIN);
print("Hallo $name");


D:\www\test>php stdin.php
Vul je naam in: Genoil
Hallo Genoil

[ Voor 26% gewijzigd door Genoil op 30-10-2006 16:57 ]


Acties:
  • 0 Henk 'm!

Anoniem: 194637

Topicstarter
Ik bedoel bijvoorbeeld een C script wat je runt en die dan om input vraagt. Dat je die vraag die dat C script aan de shell doorgeeft jij dat weer op je php-pagina krijgt en je die kunt beantwoorden.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
http://nl3.php.net/manual/en/function.proc-open.php
kanb hiermee denk ik wel..

[ Voor 76% gewijzigd door Genoil op 30-10-2006 17:02 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
en anders is er nog het system() command

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Anoniem: 194637

Topicstarter
Genoil schreef op maandag 30 oktober 2006 @ 16:52:
Bedoel je input in PHP-CLI scripts? Dat gaat zo:
PHP:
1
2
3
print("Vul je naam in: ");
$name = fgets(STDIN);
print("Hallo $name");


D:\www\test>php stdin.php
Vul je naam in: Genoil
Hallo Genoil
Het gaat mij erom dat dit vanuit php wordt uitgevoerd. In php roep je dan zo'n soort programma als hierboven aan. In de phppagina moet dan Vul je naam in: verschijnen. Dan moet je je naam invullen en dan verschijnt onder Vul je naam in:, Hallo naam. Dat is de bedoeling. Ik weet niet hoe dat mogelijk is met proc_open() of met system().

Als jullie hiervoor een voorbeeldje hebben zou heel mooi zijn. Zelf heb ik geen flauw idee hoe dit hiermee zou kunnen.

Acties:
  • 0 Henk 'm!

  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

Erhm, een PHP-script in de vorm van een site wordt server-side gerund, dus hoe was je van plan client-side systeemtools aan te roepen?

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Anoniem: 194637 schreef op maandag 30 oktober 2006 @ 17:15:
[...]

Als jullie hiervoor een voorbeeldje hebben zou heel mooi zijn. Zelf heb ik geen flauw idee hoe dit hiermee zou kunnen.
Dat staat daar netjes op de php site:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// Create a pseudo terminal for the child process
$descriptorspec = array(
   0 => array("pty"),
   1 => array("pty"),
   2 => array("pty")
);
$process = proc_open("cvs -d:pserver:cvsread@cvs.php.net:/repository login", $descriptorspec, $pipes);
if (is_resource($process)) {
   // work with it here
}
?>
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
echo '<pre>';

// Outputs all the result of shellcommand "ls", and returns
// the last output line into $last_line. Stores the return value
// of the shell command in $retval.
$last_line = system('ls', $retval);

// Printing additional info
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>
DroogKloot schreef op maandag 30 oktober 2006 @ 17:22:
Erhm, een PHP-script in de vorm van een site wordt server-side gerund, dus hoe was je van plan client-side systeemtools aan te roepen?
Nee, php is een script taal. Dat het netjes op een webserver html kan echo'en is een fijne "mogelijkheid", en daarom wordt het veel gebruikt als webserver scripttaal.
De code die php zal uitvoeren zal op de server zijn (omdat de server de php scripts ook parse'd naar html), maar je kan vanalles met php doen, zie ook bijvoorbeeld [PHP] serieele muis gebruiken

[ Voor 18% gewijzigd door mithras op 30-10-2006 17:39 ]


Acties:
  • 0 Henk 'm!

  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

Dat het een scripttaal is weet ik ook wel. ;) Mijn punt was echter hoe de TS zo'n script vanaf de server waar het op wordt uitgevoerd een prog. op de client zou willen laten starten als server != client, wat dus niet kan. (Dat topic waar je naar linkt gaat ook over een locaal script.)

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-06 10:15

MBV

hoezo niet? Je kan met PHP een ssh-verbinding openen naar de client-pc, en dan de output via de server op de client laten zien. :+
Iets soortgelijks gebruiken we nu trouwens ook waar ik werk: webserver is samba-client, die gegevens op de client-pc uitleest via samba en in een mooie GUI laat zien op een webpagina :)

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
DroogKloot schreef op maandag 30 oktober 2006 @ 18:58:
Dat het een scripttaal is weet ik ook wel. ;) Mijn punt was echter hoe de TS zo'n script vanaf de server waar het op wordt uitgevoerd een prog. op de client zou willen laten starten als server != client, wat dus niet kan. (Dat topic waar je naar linkt gaat ook over een locaal script.)
De TS vraagt volgens mij alleen om een mogelijkheid een php scriptje te draaien die processen kan starten. En dat is dan ook mijn antwoord. Dat daarin een aantal variabelen worden meegenomen die een client via internet (of gewoon een netwerk) zendt naar de server (en dat hoeft dus nog niet eens http te zijn) speelt daarin dan eigenlijk geen rol, aangezien je gewoon variabelen opvraagt/zend, en het scriptje doorzet of een nieuw script runt dat een commando uitvoert.

@TS: Verder begrijp ik niet goed wat je bedoelt met "vraag" en "input": werk je inderdaad met http, of wil je via de commandline het php script runnen?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20-06 23:43

Janoz

Moderator Devschuur®

!litemod

Uit de TS haal ik niet dat alle input van te voren gegeven wordt. De TS vraagt om interactie. Het proces vraagt om user input en die zou php dan op moeten halen bij de gebruiker. Niet van te voren, maar pas op het moment wanneer deze vraag door het proces wordt gesteld.

In php is dit onmogelijk omdat elk proces een losstaand op zichzelf proces is. Het is niet mogelijk om het gestarte proces 'over te hevelen' naar een ander proces omdat php niet beschikt over een session of application scope. De enige mogelijkheid zou een soort eeuwig draaiend script zijn die via een database, bestandjes of een telkens weer opnieuw opgezet socket berichten uitwisselt. Als je iets dergelijks loopt te implementeren zou ik mezelf nog wel eens 3x achter het hoofd krabben en op zoek gaan naar een omgeving die daarvoor wel bedoeld is of daarvoor de mogelijkheden biedt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Anoniem: 194637

Topicstarter
Janoz schreef op maandag 30 oktober 2006 @ 20:15:
Uit de TS haal ik niet dat alle input van te voren gegeven wordt. De TS vraagt om interactie. Het proces vraagt om user input en die zou php dan op moeten halen bij de gebruiker. Niet van te voren, maar pas op het moment wanneer deze vraag door het proces wordt gesteld.
Dit was wat ik bedoelde ja. Het goed formuleren van een vraag is niet mijn sterkste kant ;)
Janoz schreef op maandag 30 oktober 2006 @ 20:15:
In php is dit onmogelijk omdat elk proces een losstaand op zichzelf proces is. Het is niet mogelijk om het gestarte proces 'over te hevelen' naar een ander proces omdat php niet beschikt over een session of application scope. De enige mogelijkheid zou een soort eeuwig draaiend script zijn die via een database, bestandjes of een telkens weer opnieuw opgezet socket berichten uitwisselt. Als je iets dergelijks loopt te implementeren zou ik mezelf nog wel eens 3x achter het hoofd krabben en op zoek gaan naar een omgeving die daarvoor wel bedoeld is of daarvoor de mogelijkheden biedt.
Dan komt nu de vraag die te verwachten is denk ik. Weet iemand een taal waarmee dat wel kan? Perl, cgi-bin(bash)?

Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 20-06 18:19

DexterDee

I doubt, therefore I might be

Ik denk dat het wel zou kunnen, maar makkelijk zal het niet worden.

Check deze class die SSH ondersteunt:
http://www.phpclasses.org/browse/package/2477.html

Met deze class kun je een PHP opstarten in een eeuwige loop. Met:
PHP:
1
set_time_limit(0);
Kun je die PHP oneindig laten loopen zonder dat er een server-side timeout optreedt (werkt niet in safe mode overigens)

In die oneindige loop kun je een MySQL database queryen (bijv. elke seconde). Om de snelheid erin te houden kun je hiervoor 2 in-memory tabellen maken (ipv. MyIsam of InnoDB). Deze twee tabellen bevatten de input en output buffer.

Door middel van AJAX calls kun je met een PHP de input buffer vullen met input van de gebruiker op de webpagina en ook de output buffer weer uitlezen, leegmaken en wegschrijven op de webpagina.

Om ervoor te zorgen dat er maar 1 oneindig loop proces tegelijk draait kun je in deze php een soort beacon maken, elke seconde de huidige datum/tijd in een in-memory tabel wegschrijven. Als je de 'live shell' webpagina voor het eerst opvraagt, kun je vervolgens de huidige server datum/tijd met de opgeslagen tijd vergelijken. Indien deze datum/tijd bijvoorbeeld meer dan 10 seconden verschilt, dan neem je de aanname dat het php scriptje met de eeuwige loop niet (meer) loopt en start je deze op in de achtergrond.

Door in de input/output tabellen ook de gebruikersnaam / sessieid op te slaan kun je met 1 eeuwige loop PHP meerdere mensen tegelijk bedienen. Ze sharen dan als het ware dezelfde SSH sessie en de individuele input en output kan apart worden gequeried door middel van een unieke sleutel per gebruiker.

Het is trouwens aan te raden (wat meerdere mensen boven mij ook al aanhalen) om het account niet al teveel rechten te geven. Anders is het voor een hacker nog nooit zo makkelijk om een server volledig onder controle te krijgen.

Bovenstaande is niet de makkelijkste methode, maar heeft wel een hoge slagingskans. Hetzelfde principe wordt toegepast door bijv. 100% php only chatscripts in combinatie met AJAX technologie. Het is slecht schaalbaar maar voor een kleine groep gebruikers werkt het vrij goed.

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20-06 23:43

Janoz

Moderator Devschuur®

!litemod

php is helemaal niet bedoeld om zo lang te draaien (memory leaks ed). Je kunt dit beter oplossen door iets te pakken dat wel een session scope heeft (j2ee of .Net bv) of een applicatie maken in bv C die als server kan dienen waarnaar je met php een socket opent.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-06 10:15

MBV

waarom maak je niet gebruik van de tool 'screen'? daarmee kan je eenvoudig sessies onderbreken en weer verder gaan :)

Daarnaast zou je waarschijnlijk met Ajax ook wel wat in elkaar kunnen knutselen, maar dat zal lastig worden.

Acties:
  • 0 Henk 'm!

Anoniem: 194637

Topicstarter
DexterDee schreef op maandag 30 oktober 2006 @ 22:03:
Ik denk dat het wel zou kunnen, maar makkelijk zal het niet worden.

Check deze class die SSH ondersteunt:
http://www.phpclasses.org/browse/package/2477.html

Met deze class kun je een PHP opstarten in een eeuwige loop. Met:
PHP:
1
set_time_limit(0);
Kun je die PHP oneindig laten loopen zonder dat er een server-side timeout optreedt (werkt niet in safe mode overigens)

In die oneindige loop kun je een MySQL database queryen (bijv. elke seconde). Om de snelheid erin te houden kun je hiervoor 2 in-memory tabellen maken (ipv. MyIsam of InnoDB). Deze twee tabellen bevatten de input en output buffer.

Door middel van AJAX calls kun je met een PHP de input buffer vullen met input van de gebruiker op de webpagina en ook de output buffer weer uitlezen, leegmaken en wegschrijven op de webpagina.

Om ervoor te zorgen dat er maar 1 oneindig loop proces tegelijk draait kun je in deze php een soort beacon maken, elke seconde de huidige datum/tijd in een in-memory tabel wegschrijven. Als je de 'live shell' webpagina voor het eerst opvraagt, kun je vervolgens de huidige server datum/tijd met de opgeslagen tijd vergelijken. Indien deze datum/tijd bijvoorbeeld meer dan 10 seconden verschilt, dan neem je de aanname dat het php scriptje met de eeuwige loop niet (meer) loopt en start je deze op in de achtergrond.

Door in de input/output tabellen ook de gebruikersnaam / sessieid op te slaan kun je met 1 eeuwige loop PHP meerdere mensen tegelijk bedienen. Ze sharen dan als het ware dezelfde SSH sessie en de individuele input en output kan apart worden gequeried door middel van een unieke sleutel per gebruiker.

Het is trouwens aan te raden (wat meerdere mensen boven mij ook al aanhalen) om het account niet al teveel rechten te geven. Anders is het voor een hacker nog nooit zo makkelijk om een server volledig onder controle te krijgen.

Bovenstaande is niet de makkelijkste methode, maar heeft wel een hoge slagingskans. Hetzelfde principe wordt toegepast door bijv. 100% php only chatscripts in combinatie met AJAX technologie. Het is slecht schaalbaar maar voor een kleine groep gebruikers werkt het vrij goed.
toon volledige bericht
Dit ga ik even uitproberen. Als er nog meer tips zijn hoor ik ze graag, tot zover zijn de tips zoveel dat ik niet genoeg tijd heb om ze allemaal uit te proberen. Alvast hartelijk bedankt mensen. _/-\o_

Acties:
  • 0 Henk 'm!

  • Knorrend_varken
  • Registratie: Juni 2000
  • Laatst online: 13:20
Mischien moet je ook even naar http://en.wikipedia.org/wiki/Expect kijken.

Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 20-06 18:19

DexterDee

I doubt, therefore I might be

Janoz schreef op maandag 30 oktober 2006 @ 22:14:
php is helemaal niet bedoeld om zo lang te draaien (memory leaks ed). Je kunt dit beter oplossen door iets te pakken dat wel een session scope heeft (j2ee of .Net bv) of een applicatie maken in bv C die als server kan dienen waarnaar je met php een socket opent.
Eens, helemaal eens. Maar ik vond het wel eens leuk om helemaal los te gaan en precies te beschrijven hoe het met alleen PHP zou kunnen werken (en de vraag van de TS zo exact mogelijk te beantwoorden). Bovendien neem ik voorzichtig aan dat de TS niet bijzonder bedreven is in het schrijven van een socket applicatie, anders zou hij de vraagstelling wel anders geformuleerd hebben. Het was trouwens ook wachten op een dergelijke reactie, omdat iedere rechtgeaarde programmeur wel inziet dat PHP gebruikmakend van een stateless protocol als HTTP nooit optimaal zal kunnen werken ;)

Wat betreft memory-leaks, dat valt nog reuze mee. Ik heb enige ervaring met PHP chatbots die met GTalk in een oneindige loop via een simpel jabber protocol staan te luisteren en te reageren. Die houden het behoorlijk lang uit. Schaalbaar is het niet, met veel concurrent users loopt de hele zaak vast en krijg je een server wel op z'n knietjes, maar goed dat had ik al vermeld... ;)

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

Anoniem: 194637

Topicstarter
Graag wil ik jullie allemaal bedanken voor jullie hulp en reacties maar heb het opgegeven. In php kan dat niet. Ga nu op zoek naar een andere mogelijkheid of laat dit vervallen :)

_/-\o_ bedankt allemaal _/-\o_

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-06 10:15

MBV

Ik weet heel zeker dat het kan. Je zal er wat trucs voor uit moeten halen, maar het kan zeker weten. Kijk anders eens naar scripts die een progress-bar weergeven voor een download, dat kan namelijk ook met PHP, en gebruikt vergelijkbare technieken.
Pagina: 1