autorizzazione php shell_exec () su Linux Ubuntu


13

Sto sviluppando un'applicazione php usando il server Linux. Il mio problema è l'esecuzione shell_exec()di chiamare un file exe non funziona (in realtà non exe, è un tipo di file eseguibile di Linux)

echo shell_exec("whoami");

Ho un demone

echo shell_exec("ls")

Ho qualche nome di file ma

echo shell_exec("php -v")

Non ho niente, una pagina vuota

echo shell_exec("php ....bla bla bla")

anche una pagina vuota.

Tutti questi comandi se digito sul terminale (utente hu) funzioneranno. Ho cercato su Google per diverse ore, la gente dice che a causa del permesso. Non ho esperienza su Linux. Cosa devo fare per eseguire il mio programma in php?

Risposte:


10

L'utente di Apache www-datadeve disporre dei privilegi per eseguire determinate applicazioni mediante sudo.

  1. Eseguire il comando sudo visudo. In realtà vogliamo modificare il file in etc/sudoers. Per farlo, usando sudo visudoin terminal, duplica (temp) il sudoersfile da modificare.
  2. Alla fine del file, aggiungi il seguente esempio: -se vogliamo usare il comando per il restartfumo e il phpcomando per un'altra azione nella tua domanda,

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

(Si presume che si desideri eseguire restarte phpcomandi utilizzando i privilegi di super utente (root). E si usi il phpcomando nel usr/bin/percorso)

Tuttavia, se desideri eseguire tutte le applicazioni utilizzando i privilegi di superutente, aggiungi quanto segue invece di quanto sopra. Potresti non volerlo fare, non per i ALLcomandi, molto pericoloso.

www-data ALL=NOPASSWD: ALL

3. Dopo aver modificato il file sudoers (modificiamo il file visudotemporaneo in sudoersmodo da salvare ed uscire dal file temporaneo (visudo) per scrivere nel sudoersfile. ( wq!)

4.Così, ora usa exec()o shell_execnel modo seguente nella tua xxx.phpsceneggiatura. ricordati di usare sudoprima del comando usa nello script php.

ex:-

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

o

shell_exec("sudo php -v"); 

Quindi, nel tuo problema, aggiungi i comandi che desideri utilizzare step no (2.)mentre aggiungo e cambio il tuo script php come desideri.

qui c'è lo stesso problema del tuo /programming//a/22953339/1862107


Questa domanda non riguarda l'uso di sudo.
tricasse,

Questo è scritto così male
Barney Chambers il

5

Prova a specificare l'intero percorso del binario php. Ad esempio, /usr/bin/php

Se non lo conosci, trovalo usando: which php


echo shell_exec ("/ usr / bin / php -v"); non funziona.
ngoaho91,

quando dici "non funziona" cosa ottieni? Cioè, qualche errore? Qualcosa nei log degli errori php / apache? Se la pagina è vuota, visualizzare la fonte ti dà qualcosa con cui lavorare? Sfortunatamente il termine "non funziona" non ci dà niente su cui lavorare ...
Keiran Holloway,

@ ngoaho91 - in genere sono i registri /var/log/httpd/error*.
slm

: D ho una pagina vuota, niente da vedere. dov'è il file di registro degli errori php / apache?
ngoaho91,

@ ngoaho91 - che distro Linux è questa? CentOS, Ubuntu?
slm

4

In genere desidera specificare i percorsi completi per applicazioni come whoami, lse php. Se non sei sicuro di quale sia la posizione di un programma (percorso completo) puoi scoprirlo in questo modo:

$ type php
php is /usr/bin/php

Quindi specificalo in questo modo nel tuo script.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>

ho eseguito il tuo comando. digitare php => php è / usr / bin / php. ma il comando percorso completo mi restituisce ancora una pagina vuota.
ngoaho91,

E se lo fai echo shell_exec("/usr/bin/php somefile.php 2>&1"):?
slm

echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: errore di riposizionamento: / usr / bin / php: simbolo X509_free, versione OPENSSL_1.0.0 non definita nel file libcrypto. so.1.0.0 con riferimento al tempo di collegamento
ngoaho91,

OK, il server Web (Apache) in genere è in esecuzione come un altro utente, non hu. Quindi è necessario fare in modo che lo script phpsta tentando di familiare si trova in questo modo: chmod 755 somescript.php. Ciò consentirà all'utente in cui Apache è in esecuzione, di poter eseguire e leggere il tuo .phpfile.
slm

1
@ ngoaho91 - ora dovrebbe andare tutto bene, quell'errore mi dice che c'è qualcosa che non va con la tua configurazione di Apache / PHP. freetutorialssubmit.com/php-relocation-error/2221
slm

2

Php.ini limita il set di comandi disponibile?

Questo è dal mio /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =

no, il mio stesso come il tuo
ngoaho91,

2

Come eseguire il debug di problemi shell_exec

OK, qui abbiamo un problema: qualcosa funziona nel terminale e non funziona in shell_exec di php (o exec, spawn, qualunque cosa). Pensiamo: qual è la differenza tra te e php? Eccone tre:

PHP viene eseguito dalle regole del server HTTP

In effetti, il tuo terminale è in esecuzione yournamedall'utente e php viene eseguito da www-data. Quindi, la prima idea è quella di aprire il terminale www-datadall'utente e provare lo stesso comando. Così....

  • Apri il /etc/passwdfile, trova la linea con l' www-datautente e cambia la shell di accesso (l'ultima) da /bin/false(o qualsiasi altra cosa) a /bin/bash.
  • www-dataTerminale aperto :su www-data
  • Prova php -v o qualunque altra cosa non puoi eseguire da php. Se non funziona, vedrai dei bei log e sarai in grado di eseguire il debug del problema.
  • Non dimenticare di riparare il /etc/passwdfile indietro mentre hai finito

PHP viene eseguito da PHP .

PHP è un enogh paranoico e ci sono molte opzioni nella configurazione di apache / nginx e php.ini che potrebbero interrompere il tuo tentativo.

Questo è un po 'più complicato per il debug. Ci sono due opzioni qui:

  • Abilita i log nel browser e vedi il problema. Modifica il tuo php.ini, attiva display_errorse tutti gli altri flag per visualizzare gli errori nel browser. Li puoi leggere ed eseguire il debug.

  • Ottieni www-datala shell (vedi prima sezione) ed esegui qualcosa del genere

echo '<?php shell_exec("php -v"); ?>' | php

che eseguirà lo stesso codice php nella console e sarai in grado di vedere errori e debug.

PHP viene eseguito da SELinux / apparmor

Selinux e apparmor sono elementi di sicurezza che vietano alle applicazioni di eseguire azioni specifiche (ad esempio, generando altre applicazioni o altre specifiche applicazioni). Forse è abilitato sul tuo server.

Per verificare - disabilitare selinux / apparmor e verificare se esiste un problema.

Per risolvere: leggi il manuale appropriato e fissa le regole di scrittura consentite per il tuo caso.


0

Per me il modo più semplice era quello di entrare nel php.ini e commentare la riga che inizia con

disable_functions
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.