Newsgroup: it.comp.www.php
Titolo: valorizzare stdin per exec,system,passthru,`` ....

salve. ho uno shell script che lancio con php tramite `` o exec o
system o passthru.
Il problema è che questo script richiede un input da stdin, input che
io mi ritrovo in una variabile php.
come la passo allo script?
Matteo

Matteo Rossini scriveva il 09/01/2008 :

Non ne sono sicuro, ma temo non si possa fare, almeno non con exec,
system, passthru, ecc.
Ciò che puoi invece sicuramente fare, se lo script di shell lo hai
fatto tu, è passare gli input direttamente da linea di comando (usando
ad esempio in C i classici argc e argv). In questo modo scriverai
qualcosa tipo:
exec('programma.exe "input1" "input2"');
-- 
rob4you

Matteo Rossini ha scritto:

Se la shell che utilizzi lo supporta puoi provare con l'operatore <
all'interno del comando che lancerai.
In alternativa puoi utilizzare le funzioni "Program Execution" tipo
http://www.php.net/proc_open
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

io mi ritrovo in una variabile php.
Se adesso lo lanci con system("/usr/local/bin/script.sh"), prova a
lanciarlo con
	system('echo -ne "input\n" | /usr/local/bin/script.sh');
...senno' ti tocca andarci giu' dvro di popen().
Leonardo
-- 
While ordinarily valid that being widespread does not make a statement
true, I feel that the diffusion of anti-evolutionary beliefs does pose
a strong argument for Darwin having been, indeed, sorely mistaken.


il problema, però, è che $input talvolta è un file binario, quindi
system('echo '.$input.'|....');
e questo non sembra piacergli molto.
ho ovviato con una soluzione che non mi piace, ma funziona.
scrivo l'input su un file temporaneo con fwrite e vado di
system('cat /tmp/file|.....');
Matteo

e questo non sembra piacergli molto.
Allora "<" come gia' suggerito da Filippo. Oppure, ripeto, popen.



popen non l'ho provato (adesso me la vedo), ma < vuole un file
comando.sh < nomefile
questa sintassi è perfettamente identica a
cat nomefile|comando.sh
matteo 

cat nomefile|comando.sh
No: in un caso e' in gioco solo la shell, che apre nomefile e lo
ridirige allo script.
Nel secondo c'e' cat, che apre nomefile, e la shell che ridirige
lo stdout di cat allo script.
Normalmente sono d'accordo che "non cambia nulla" (negli effetti
finali). Ma per es., se hai parecchie handle aperte, oltre che a
un maggior dispendio di risorse (poca roba, eh), potresti vedere
che il primo sistema funziona e il secondo no.
Su Windows invece puo' succedere il contrario, usando le utility
della Cygwin e un programma - non uno script! - fatto con MinGW.
(Un'altra cosa che puo' succedere usando stdin della shell su un
Windows con Apache da PHP, e' che il processo alla fine di tutta
la catena si blocca, la handle rimane aperta, Apache non termina
il processo e il sito Web smette di rispondere - da task manager
vedi uno sbirillione di CMD.EXE aperti e in standby).


 finali).
si, scusa.. per 'identico' intendevo questo (gli effetti finali).
ancora meglio, per la precisione, intendevo che non avrebbe risolto il
mio problema.
mentre popen sembra quello giusto, però mi funziona in parte (non l'ho
ancora visto bene)
<?php
$handle = popen("cat file.bin", "r");
$fl=fread($handle,4097);
pclose($handle);
$handle = popen("cat >/tmp/file.bin", "w");
fwrite($handle,$fl);
pclose($handle);
?>
mi crea /tmp/file.bin di 4096 byte anzichè 4097
Matteo

mi crea /tmp/file.bin di 4096 byte anzichč 4097
??? Questo e' misterioso. La strlen di $fl quant'e' (e la
lunghezza di file.bin)?
Leonardo perplesso


 Leonardo perplesso
ancora più curioso:
<?php
$handle = popen("cat /tmp/pippo1", "r");
$xx=fread($handle,5000);
pclose($handle);
echo strlen($xx)."\n";
?>
# dd if=/var/log/messages of=/tmp/pippo1 bs=1 count=4299
# php aa.php
4299
# dd if=/var/log/messages of=/tmp/pippo1 bs=1 count=4300
# php aa.php
4096
Matteo