Lo script PHP non può eseguire lo script bash. sh: autorizzazione negata


14

Sto cercando di eseguire uno script .sh da PHP, tuttavia non è in esecuzione.

Ho controllato i log degli errori e visualizzo l'errore "sh: Autorizzazione negata". Ho controllato sotto quale utente php è in esecuzione, ed è fatto sotto l'utente apache.

Ho provato a cambiare la proprietà del .sh per l'utente apache, ma non ci sono risultati.

All'inizio ho pensato che ciò fosse dovuto al fatto che lo script era al di fuori di www / dir, tuttavia anche quando ho inserito lo script nella stessa directory, l'errore viene ancora visualizzato.

Ci sono soluzioni a questo oltre all'aggiunta dell'utente apache all'elenco SUDOers?

Lo script sh funziona bene se lo lancio da putty usando il comando 'php nomefile.php'.


3
È uno script di shell o un file PHP? Il tuo ultimo paragrafo non è chiaro al riguardo. Inoltre, hai impostato i permessi di esecuzione ( x) sul file? Hai specificato l'interprete di script in una riga shebang?
Daniel Beck

È uno script bash che può essere eseguito da PHP. Sì, l'ho reso un eseguibile e ho specificato l'interprete dello script. Funziona correttamente quando eseguo lo script PHP da putty e lo script bash viene chiamato ed eseguito correttamente. Ma se eseguo lo script php dal browser Web, invece, non riesce a eseguire lo script bash e farà questo errore poiché è in esecuzione come utente apache e non come utente che utilizzo in putty.
Robin Presto,

1
Prova chmod 775 yourscript.sh. Ciò consentirà r-x(leggere ed eseguire) le autorizzazioni agli utenti "Altro" su quel file.
Rhyuk,

L'ho provato. Nessuna fortuna .. Non posso sapere il motivo esatto fino a domani però. Non ho accesso ai registri dalla mia posizione. Tornerò da voi ragazzi. Grazie per l'aiuto. :)
Robin Presto,

Risposte:


10

Prova i seguenti suggerimenti:

  • Prova a eseguire sotto il comando test e controlla se ha funzionato:
    • php -r "echo exec('whoami');"
  • Assicurarsi che tutte le directory principali e i file dispongano almeno delle r-xautorizzazioni flag:
    • chmod 755 dir; chmod 755 file
  • Assicurati che il proprietario del file sia il tuo utente Apache .
    • Prova anche ad aggiungere un +sflag (sudo) al file (non consigliato):
      • chmod u+s file,
  • Assicurati che il tuo PHP non sia in esecuzione in a safe_mode.
  • Assicurati che lo script sia all'interno della tua radice di Apache:
    • Altrimenti, sposta lo script al suo interno,
    • o aggiungi quella directory alla tua configurazione di Apache,
    • o aggiungi questa directory alla tua include_path, ad esempio:
      • php.ini file: include_path ".:/usr/local/lib/php:/your/dir"
      • o .htaccessfile:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Verifica se la shell è impostata su valida (ad es. /bin/sh) Per il tuo utente Apache (ad es. Verifica con:) finger.
  • Assicurati che php.ininon usi: disable_functionsper la execfunzione
  • Se si utilizza SELinux o si è selinux-utilsinstallato (un sistema Linux ottimizzato per la sicurezza), controllare getenforce/ setenforceconfigurare come descritto nella risposta @Tonin .

Risoluzione dei problemi:

  • Se hai modificato il file php.inio httpd.conf, non dimenticare di riavviare il server Web,
  • Controlla il log degli errori di Apache per ulteriori dettagli.
  • Attiva nel vostro php.initutti i tipi di errori ( display_error, error_reporting, ecc).

1
Quello era il mio problema ... la directory principale non aveva i diritti di esecuzione ... ora funziona! Grazie! :)
Robin Presto

Ancora nessuna fortuna per me :( Qualche suggerimento? `` `[Root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x.27 radice radice 4096 set 3 12:31 / drwxrwxrwt.4 radice radice 4096 set 3 15:45 / tmp -rwxr-xr-x.1 radice radice 24 set 3 15:39 / tmp / sleep safe_mode = Off include_path = "/ tmp: / home / kiwi_build" `` `
pihentagy,

1
Argh, setenforce l'ha risolto. OMG
pihentagy,

13

Tale problema potrebbe dipendere dal sistema operativo utilizzato e dalla sua configurazione. Alcune distro di Linux (principalmente quelle basate su RHEL come CentOS o Fedora) vengono fornite con SELinux attivato di default. Questo può essere verificato e temporaneamente modificato, con i seguenti comandi:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

Puoi anche avere una visione più completa della configurazione corrente con:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Questa modifica può essere resa permanente modificando il /etc/selinux/configfile e impostando la SELINUXvariabile su permissiveo disabled.

Tuttavia, il modo corretto di risolvere questo tipo di problema , se si è effettivamente in questa situazione, è controllare il /var/log/audit/audit.logfile di registro. Conterrà tutti gli eventi relativi alle regole SELinux. Probabilmente dovresti quindi dare al tuo script il contesto corretto, ovvero essere autorizzato ad essere eseguito dall'utente apache / php. Il controllo del contesto di sicurezza di SELinux viene eseguito con ls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

Questo elenca l'utente, il ruolo e il tipo di ciascun file / directory. Qui il httpd_sys_script_exec_ttipo dà ai file nella directory cgi il permesso di essere eseguito da httpd. Lo script della shell dovrebbe probabilmente avere lo stesso tipo.

Puoi anche alimentare le audit.logrighe al audit2allowcomando. Ti darà le modifiche necessarie per rendere felice SELinux. Ma di solito le modifiche suggerite devono essere fatte sulla stessa politica SELinux che non è ciò che dovresti fare nel tuo caso (tuttavia, questo output può dare qualche indizio su cosa sta succedendo).

La pagina seguente descrive un problema simile e diversi modi per risolverlo: http://sheltren.com/stop-disabling-selinux


Grazie per la risposta dettagliata! Purtroppo, come ho già detto, non potrò accedere alla radice fino a domani. Quindi tornerò anche da te! :) E sì, sto usando CentOS.
Robin Presto,

Ho adorato la tua risposta, molto istruttiva! Sfortunatamente non ho scelto il tuo perché l'applicazione era disabilitata e non era il problema. Anche se ho imparato molto dalla tua risposta, quindi grazie. Ti voterò quando avrò abbastanza reputazione :)
Robin Presto

Nessun problema, felice di sapere che hai imparato dal mio post!
Tonin

Se il problema è ottenere, allora non è davvero ovvio cosa diavolo stia succedendo. Mi ha salvato la giornata!
pihentagy,

1

Quindi sono arrivato qui dopo aver cercato un problema simile su Google. Ho pensato di lasciar perdere che il commento su SELinux mi ha indicato la giusta direzione.

Nel mio caso, stavo usando uno script di distribuzione Git personalizzato che utilizza un comando shell. Il comando funziona bene su BASH ma ha "permesso negato" e "non un repository" su Git. Questo è stato davvero strano e ho affrontato più correzioni fino a quando non mi sono imbattuto in questa risposta.

root@ls:~# /usr/sbin/setenforce Permissive risolto il problema per me.


0

La mia situazione è leggermente diversa, ma Google mi ha portato qui, quindi ho pensato di condividere ...

Il mio server sta eseguendo debian stable e sta provando a eseguire uno script di shell funzionato una volta, quindi le autorizzazioni sono cambiate automaticamente in 644 e il successivo tentativo di eseguire lo script ha avuto Permission denied. Si è rivelato essere un problema con il server samba per me e non ho notato il modello fino ad ora.

L' autorizzazione QA Strange cambia quando si salva il file su una partizione Samba da un editor di Windows . Non sapevo map archive = nodell'opzione anche dopo aver usato le condivisioni di samba per un decennio.

Qualcosa sull'uso di Notepad ++ su un desktop di Windows cambierebbe le autorizzazioni dei file di destinazione su 675 anziché su 775 quando è configurato umask.


-7

Esecuzione dei comandi di root in PHP tramite Apache

Ho un'applicazione web che deve eseguire i comandi di shell come root all'interno di una funzione PHP, e penseresti che sarebbe piuttosto semplice ... ma ci sono voluti alcuni miei google per ottenere tutti i dettagli, quindi ecco le mie note utili su esso. Questo è su un sistema Linux che esegue Apache e useremo "sudo" in "shell_exec" per eseguire i comandi.

La cosa principale è modificare il file / etc / sudoers, e in genere puoi (come root) usare il comando "visudo" per farlo.

Assicurati che apache sia in grado di eseguire comandi e non richieda una password:

apache  ALL=(ALL)       NOPASSWD: ALL

Quindi devi commentare questa riga:

#Defaults    requiretty

Se non lo fai, vedrai questi errori in / var / log / secure: "scusa, devi avere un tty per eseguire sudo". Ora sei pronto per partire e il codice PHP è semplice:

$ results = shell_exec ('sudo date');


5
Questa è un'idea terribile . Se l'installazione di apache viene compromessa o l'applicazione in esecuzione lo fa ... il tuo hacker ottiene l'accesso completo al sistema troppo facilmente. La cosa giusta è cambiare i permessi sulla sceneggiatura, non lasciare le cose spalancate
Journeyman Geek

2
Mi sento obbligato a emettere un voto negativo su questa risposta a causa delle ovvie preoccupazioni di sicurezza con dare all'utente / ruolo apache tutte le autorizzazioni.
Ramhound,

@JourneymanGeek Non è "se", è quando l'installazione viene compromessa.
Michael Hampton,
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.