2009-02-11 8 views
32

Ho un certo script PHP che chiama exec() per eseguire un comando per convertire un PDF in JPG. Questo comando funziona bene in bash.PHP exec() non eseguirà il comando shell quando viene eseguito tramite il browser

di prevenire le vostre ipotesi iniziali di risoluzione dei problemi, tenere presente quanto segue:

  • safe_mode = Off
  • autorizzazioni per la directory che contiene il file PDF e lo script è impostato su 777, e questo elenco è anche il luogo dove il JPG è stato scritto
  • Il comando che sto passando a exec() punta esplicitamente al binario utilizzato (ad es./Usr/local/bin/convert).
  • display_errors = On
  • error_reporting = E_ALL
  • disable_functions = [vuoto]
  • sto riecheggiando exec() s 'uscita e restituisce nulla. Il comando eseguito per impostazione predefinita non restituisce nulla.

Quando chiamo questo script PHP dal browser (visitando http://www.example.com/script.php), exec() non esegue il suo argomento.

IMPORTANTE: So che ci sono problemi con il mio script o il modo in cui ho costruito il comando bash, perché da bash, posso eseguire lo script con 'php' e funziona (ad esempio, script php'. php 'converte il file)

Ho anche provato a spegnere exec() con system().

Infine, ho avuto questo problema una volta in passato, ma non ricordo come l'ho risolto.

So che c'è qualcosa che mi manca, quindi spero che qualcun altro abbia provato questo come ho e ricorda come sistemarlo!

Grazie in anticipo per qualsiasi tipo di assistenza è possibile fornire.

Alex

+0

In PHP 5 assicurarsi di utilizzare E_ALL | E_STRICT per la segnalazione completa degli errori. – Ross

+0

* AGGIORNAMENTO - IMPORTANTE *: ho scoperto che si trattava di un problema con ImageMagick e ho completato la conversione da PDF a JPEG con GhostScript (con un comando molto più lungo) invece di usare ImageMagick come un intermediario. Non ci sono stati problemi con PHP, le mie autorizzazioni o exec(). Grazie per tutto il vostro contributo! – Alex

+0

Quali sono gli argomenti passati alla conversione? Includono il percorso completo del file? – Powerlord

risposta

6

Solo alcune ipotesi, potrebbe essere che l'utente processo server web non dispone dei privilegi per farlo.

+0

Eccellente! Questo è un ottimo punto. Se chiami uno script di bash con exec (tramite php) assicurati che anche lo script di bash sia leggibile da Apache. –

5

Dal momento che funziona quando dalla riga di comando (che si troverebbe sotto il proprio account utente), mi sembra che l'account sul quale il server Web è in esecuzione (spesso "www-data") non disponga delle autorizzazioni di esecuzione sul programma di conversione.

+1

Come può qualcuno dare le autorizzazioni? – glarkou

2

L'utente Apache/webserver dispone dei diritti necessari per eseguire il comando shell?

Quando si esegue da cl, è probabile che si stia eseguendo come un altro utente, il che potrebbe spiegare quale cl funziona ma tramite browser no.

+0

come controllare è perrmiss? –

3

Hai considerato le autorizzazioni per i file? Nel browser, php è in esecuzione sotto un utente, ma quando lo si esegue in bash, è probabile che sia in esecuzione con le autorizzazioni dell'utente.

È la prima cosa che vorrei controllare.

Amy

64

Aggiungi 2>&1 alla fine del vostro comando per reindirizzare gli errori da stderr su stdout. Questo dovrebbe chiarire cosa sta andando storto.

+0

Sì, ricevo uno strano errore ImageMagick: convert: manca un'immagine nome file 'test.jpg '@ convert.c/ConvertImageCommand/2766. Dopo aver cercato un po 'con Google, sembra che potrebbe essere un rilascio bacato. Sto ricostruendo l'ultima revisione stabile e test in pochi minuti. – Alex

+3

questo è un consiglio eccellente! – bzx

+1

omg !!!!!!!!!!!!!!!!!!! – Tebe

0

Ho determinato che questo è un problema con ImageMagick, non con PHP. Sto tentando alcune correzioni e, se non funzionano, finirò per utilizzare una libreria condivisa PHP (probabilmente imagick) per fare il lavoro.

1

Potrebbe essere dovuto ai diversi utenti che eseguono lo script tramite il server Web e lo script tramite bash.

Normalmente gli script/exec sono stati richiamati tramite server come con l'utente "www" e questo utente non ha accesso in scrittura alla propria area. ma quando esegui lo script in bash, allora hai i permessi di scrittura.

0

Il dispositivo di uscita predefinito è cambiato.

login come www (dopo l'abilitazione) fornisce l'output tramite shell, ma non tramite php.

1

L'utente di Apache www-data deve disporre dei privilegi per l'esecuzione di determinate applicazioni utilizzando sudo.

  1. Eseguire il comando sudo visudo. In realtà vogliamo modificare il file in etc/sudoers. Per farlo, utilizzando il terminale sudo visudo, duplicare (temp) il file sudoers da modificare.
  2. Alla fine del file, aggiungere il seguente esempio: -se vogliamo utilizzare il comando per il riavvio smokeping e il comando mount per un'altra azione,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount

(Ciò presuppone che si desidera per eseguire restart e mount comandi utilizzando privilegi (root) superutente.)

Tuttavia, se si desidera eseguire ogni applicazione utilizzando privilegi di superutente, quindi aggiungere t segue invece di ciò che è sopra. Potresti non volerlo fare, non per i comandi ALL, molto pericoloso.

www-data ALL=NOPASSWD: ALL 

3. Dopo modificare il file sudoers (da visudo abbiamo modificare il file temporaneo di sudoers quindi salvare e chiudere file temporaneo (visudo) per scrivere in sudoers file. (wq!)

4 .Così, ora utilizzare exec() nel seguente script all'interno dello script xxx.php. Ricordarsi di utilizzare sudo prima di utilizzare il comando nello script php.

es: -

exec ("sudo /etc/init.d/smokeping restart 2>&1"); 

Quindi nel tuo problema, aggiungere i comandi che si desidera utilizzare per la step no (2.) come aggiungo e modificare lo script PHP come ciò che si desidera.