Newsgroup: it.comp.www.php
Titolo: Far eseguire file batch a linux

Ciao, vorrei far eseguire al sistema (ubuntu server) le istruzioni 
contenute in un file di testo, tramite un comando php.
In sostanza, devo eliminare alcune directory (che contengono molte 
sottodri e file).
Vorrei creare un file le cui righe sarebbero del tipo:
rm -R [NOME_DIR]
rm -R [NOME_DIR]
rm -R [NOME_DIR]
...ecc.
quindi vorrei dare un comando al sistema opereativo, tramite php, in 
modo che esegua i comandi del file. Così eviterei problemi di timeout di 
php, aumenterebbe la velocità di eliminazione ecc.
È possibile?
grazie

 È possibile?
http://it.php.net/manual/en/book.exec.php
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
I know exactly what you mean. Let me tell you why you're here. You're here
because you know something. What you know you can't explain. But you feel
it. You've felt it your entire life. That there's something wrong with the
world. You don't know what it is but it's there, like a splinter in your
mind driving you mad. It is this feeling that has brought you to me.
Do you know what I'm talking about?
    --Morpheus, "Matrix"


ma uno scriptino shell, non ti migliora la vita??
magari inserite in cron se la cosa deve essere calendarizzata.
per tutto ciò che è "di sistema" puro io userei bash script.
l'utilizzo di php per eseguire comandi di sistema, IMO ha senso quando 
si crea un interfaccia web che amministra il sistema come possono essere 
i vari pannelli di controllo per hosting, VPS e cose simili.
Ciao

 Ciao
Ciao, in effetti č proprio in un pannello web che mi serve. L'utente 
deve cancellare una scheda alla quale sono associati molti allegati 
(immagini contenute id una directory con altre sotto-directory).
Per questo ho pensato che, al momento dell'eliminazione, posso fare una 
query per tutti gli allegati associati alla scheda e scriverne il nome 
in un file di testo, nel modo descrito all'inizio di questo post.
Quindi, vorrei far eseguire i vari comandi rm -R... dando in pasto al 
system il file tramite php.
Se Mi sembra popen() potrebbe fare al caso mio, ma non ho capito se, 
dandogli in pasto il file esegue i comandi contenuti, e se php deve 
comunque aspettare la fine del processo, che č proprio quello che vorrei 
evitare.
grazie a entrambi per le risposte


così facendo perdi il controllo se per caso l'operazione di
cancellazione è andata a buon fine (non sai se effettivamente il
comando exec ha cancellato realmente), ti consiglio i comandi
nativi php unlink e rmdir che ti danno il controllo se per caso
il file/directory esiste e se è stato cancellato.
Ciao
-- 
Postato da Virgilio Newsgroup: lo usi da web ma con le funzioni del newsreader 
http://newsgroup.virgilio.it
Gerarchie it, italia, it-alt, tin, it.binari. Unico!

 il file/directory esiste e se è stato cancellato.
Il problema e' che vuole usare la shell perche' lo script PHP ci mette troppo tempo.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Warning! Dates in calendar are closer than they appear.

 
certo che eseguire n chiamate exec per ogni riga del file, non è
che sia "leggera" e veloce, allora è meglio uno script bash che
legge il file e cicla per ogni riga, e il comando exec esegue il
bash script, allora si che è veloce (lo esegue una sola volta), 
ancora meglio se la chiamata al comando exec('.....') avviene in
un contesto ajax, almeno diventa asincrono e non viene
influenzato dal tempo (poi logicamente mooooolto dipende dal tipo
di applicazione che si sta scrivendo).


 Ciao
Ecco, questa credo sia la soluzione che fa al caso mio. Ora cerco un po' 
di doc/tutorial su come creare uno script bash che legge il file ecc. 
(se avete qualche link con esempi o altro, mi fate un favore).
Intanto, grazie per avermi "schiarificato" le idee!
ciao

nervino ha scritto:

delfile.sh
-------------------
#!/bin/bash
CANCELLA=`cat filerm.txt`
for i in $CANCELLA
do
        rm -rf $i
done
----------------
converti il delfile.sh in eseguibile chmod 445 (o quello che vuoi
777 *per dare pieno accesso al file a chiunque*)
all'interno del file filerm.txt
inserisci SOLO il path e il nome del file:
filerm.txt
-----------
/home/pippo/miofile.txt
/home/pippo/miofile1.txt
/home/pippo/miofile2.txt
/pluto/miofile1.txt
/directory/directory1/
/dir/dir/
-------------------------


Bramante ha scritto:

PS
stai MOOOLTO ATTENTO a dove inserisci il file eseguibile
(delfile.sh) e dove inserisci il file che contiene le righe da
cancellare.
rischi di fare DANNI IRREPARABILI, immagina un hacker che riesca
a mettere le mani sul delfile.sh (può modificarlo e farci quello
che vuole), oppure immagina che mette le mani sul file.rm e
aggiunge la stringa "/" (la root del sistema).
un consilgio, inserisci entrambi i file FUORI la WEBROOT, meglio
ancora se la metti in una cartella dove non possa fare danni e
controlla che apache non stia girando con permessi ROOT, fallo
girare con permessi di esecuzione minimi (apache).


 Ciao
Ma se li metto fuori della root del sito, poi posso far eseguire a php 
delfile.sh?
(grazie 1000!)

 
while read -r line
    do
        echo "$line"
    done < "$file"
Leggi la voce per sapere perché non usare il ciclo for unito a cat.

 Leggi la voce per sapere perch� non usare il ciclo for unito a cat.
Grazie!

 Leggi la voce per sapere perch� non usare il ciclo for unito a cat.
Allora, ho fatto questo script che da shell funziona bene, ma non 
funziona per niente se lo richiamo da php:
del_allegati.sh
---------------------------------------------
#!/bin/bash
NOW=$(date +"%b-%d-%y")
CANCELLA="file_rm_allegati.txt"
LOGFILE="log_eliminazione_allegati/log_$NOW.log"
echo "#--- $(date)" >> $LOGFILE
while read -r CANCELLA; do
rm -rfv $CANCELLA
echo "$CANCELLA" >> $LOGFILE
done < $CANCELLA
# svuoto il file
 > file_rm_allegati.txt
file_rm_allegati.txt (file con l'elenco delle dir da cancellare)
---------------------------------------
prova_eliminazione_bash/dir4/
prova_eliminazione_bash/dir5/
prova_eliminazione_bash/dir6/
prova_eliminazione_bash/dir7/
pagina php
---------------------------------------
<?php
system('sh del_allegati.sh');
?>
Ho provato ad eseguire un file .sh da php, con dentro solo echo "ciao", 
e funziona, ma solo con la funzione system(), non con exec()
Esempio:
system(' prova.sh'); funziona
exec('sh prova.sh'); non funziona
exec('prova.sh'); non funziona
Inoltre, vorrei sapere se � possibile catturare gli eventuali errori nel 
file di log. Ad esempio, se una dir non � stata cancellata ecc.
grazie

 system(' prova.sh'); funziona
correggo:
system("sh prova.sh"); funziona
o anche
system("/bin/sh prova.sh"); funziona


Risolto, era una questione di permessi sulle dir da eliminare, eseguendo 
da PHP.

On 22/10/2010 18.07, nervino wrote:

Risolto. Era una questione di permessi sulle dir da cancellare.

 Risolto. Era una questione di permessi sulle dir da cancellare.
Non proprio risolto...
Ora il problema è che vorrei poter cancellare file e dir contenute in 
"prova_eliminazione_bash/" a prescindere dai permessi che hanno. 
Infatti, i file non generati direttamente da php non mi vengono cancellati.
Per risolvere dovrei eseguire lo script bash come ROOT, giusto?
Vorrei qualche indicazione in proposito, anche alla luce dei consigli di 
Bramante nei post precedenti.
Apache gira come www-data.
Lo script bash l'ho messo in una directory fuori la webroot (e gli ho 
dato chmod 777. Ho fatto male?). Anche il file con l'elenco delle dir da 
cancellare si trova nella stessa dir.
Il file php che esegue lo script bash, e le dir da cancellare (in 
"prova_eliminazione_bash/"), sono ovviamente nella webroot.
ciao e grazie