Tema: Re: proc_open velniava
Autorius: flegmatoid
Data: 2010-02-25 11:48:31
panasiai mastom :)

pirmame meile pamirsau pasakyti, kad php-to-php komunikacija man taipogi 
veike kuo puikiausiai (testukas l. panasus i tavo pademonstruota)
su fopen'u nuo vakar zaidziu, kolkas be rezultatu
kas del windozes - neprioritetine OS - ant jos tik testa papildoma idomumo 
delei paleidau

dabar, gi, mastau visa sita grozi shell'o pagalba realizuoti, o php puseje 
viska tik "bukai" nuskaitineti (tik, gal ne tiek sudetingai kaip kad tu 
siulai).
kadangi testavausi su kruva tools'u (bandziau ssh login'a emuliuoti, top'o 
output'a ivairu nuskaitneti) -  pernelyg nukrypau nuo temos

prisegiau failiuka su demonstracija to, ka noriu pasiekti - itariu pats 
nmap'as ten kazka velia pats is saves :\

"Justas Butkus" <butkus.justas@gmail.com> wrote in message 
news:hm49pi$86g$1@trimpas.omnitel.net...
> Čia, sakyčiau, toks susitarimas, kad spustelėjus Enter (ne! Tai
> nelaikytina ASCII(10), tai gali būti laikoma kontrolinė komanda perduoti
> valdymą) prasideda kitas apdorojimas.
> Nesu tikras, shell'as, man, tai vieta, kur gyvena magija. :)
>
> php://stdin
> <-- siūlau į tą patį $pipes[0], ar dar kur, pabandyti atsidaryti (fopen)
> šitai.
> Nors šiaip nežinau, ar veiks, nes širdis sako (o kodą žiūrėti tingiu),
> kad fifo failų pagrindu tai gali veikti.
> Iš kitos pusės, except'ionai Windows'uose, neleidžiantys turėti
> aukštesnių nei 3 lygmens pipe'ų kelia abejonių...
>
>
> Kitas variantas - rankomis daugiau pasidarbuoti.
> Pvz.: posix_mkfifo leidžia tuos named pipe'us kurtis pačiam.
> Tiesa, darbelio jį apdorojant ir/ar perduodant veiksmus tolesniam
> procesui bus ne taip ir mažai.
>
>
> Trečias variantas - kas tai per procesas vis tik?
> Nes šitaip:
> <?php
> // file_name: vykdytojas.php
> $pipesSpec = array(0 => array("pipe", "r"), 1 => array("pipe", "w"),
>                    2 => array("pipe", "r"));
>
> $proc = proc_open('php -f skaitytojas.php', $pipesSpec, $pipes);
>
> fwrite($pipes[0], 'Eilutė pirma' . PHP_EOL);
> $output = fgets($pipes[1], 128); echo $output;
>
> fwrite($pipes[0], 'Eilutė antra' . PHP_EOL);
> $output = fgets($pipes[1], 128); echo $output;
>
> fwrite($pipes[0], 'gana' . PHP_EOL);
> $output = fgets($pipes[1], 128); echo $output;
>
> proc_close($proc);
> ?>
> <?php
> // file_name: skaitytojas.php
> <?php
> $line = '';
> $fh = fopen('php://stdin', 'r');
> while(1) {
>     $line = ;
>     echo 'Gavau: ' . trim(fgets($fh, 128)) . PHP_EOL;
> }
> fclose($fh);
> return 0;
> ?>
>
> Pakvietus 'php -f vykdytojas.php' veikia bendravimas.
>
>
> --
> JB
>
> 2010.02.24 11:29, flegmatoid rašė:
>> na SSH'o atveju subeldus komanda ir spustelejus enter ("\n"), grazinamas
>> output'as, kuri as esu linkes pamatyti. As taip pat esu linkes testi
>> konmandu ivedima.
>>
>> Gi - pavyzdyje matyti, kad ta outputa as galiu gauti tik vienu budu -
>> uzdares pipe'a i kuri tas outputas paseriamas - t.y. nupjoves saka ant
>> kurios sedziu.
>>
>> Dar vienas klausimas prie to pacio - faktas kad procesas vis dar sukasi
>> (proc_open yra elementarus fork'as) - gal kokiu nors subtiliu budu galima
>> vel prisipe'inti prie jo? Tik va, $pipes[0] po uzdarymo yra NULL :\