Debian: uccidi una sessione dello schermo attraverso il web


1

Ho un codice php che è il seguente (kill.php):

<?php echo exec("/home/duke/aa/scripts/test.sh");  ?>

test.sh si presenta così:

screen -S server -X quit

Se eseguo il codice php nel terminale php screen -S server -X quitlo script uccide la sessione dello schermo.

Tuttavia, se indico il mio browser web su http: //mywebsite/test.php , viene visualizzato "Nessuna sessione schermo trovata" e non uccide la sessione schermo. Cosa posso fare per farlo funzionare tramite il browser Web?

Risposte:


1

La configurazione predefinita è di eseguire tutte le pagine PHP (e i loro comandi generati) come www-datautente, il che significa che hanno accesso solo alle sessioni di proprietà www-data.

Devi eseguire lo script con il tuo account utente, che può essere fatto da:

  • usando sudo; ad esempio, la seguente voce sudoers :

    www-data: ALL=(duke) NOPASSWD: /home/duke/aa/scripts/test.sh

    ti lascerà correre exec("sudo -u duke /home/duke/aa/scripts/test.sh");

  • o installando suPHP : lo script PHP verrà quindi eseguito con l'account del suo proprietario.


L'esempio corrente esegue lo script due volte , che può avere vari effetti collaterali. Sbarazzati della seconda exec()chiamata - o ancora meglio, usa system()o passthru()invece - se vuoi visualizzare l'output dello script.


Le sessioni sono di proprietà di root. Devo modificare anche la voce sudoers? Quindi nel mio caso devo eseguire exec ("sudo -u root /path/to/.sh")?
Dukevin,

@Kevin: corretto. Anche se rootè il valore predefinito per sudo , quindi puoi usarlo solo sudo /path/to/.shin questo caso.
Grawity

Mi spiego per favore come posso modificare la mia voce sudoers?
dukevin,

@Kevin: sostituire (duke)con (root)e correggere il percorso .sh, se necessario.
Grawity

Posso posizionarlo www-data: ALL=(root) NOPASSWD: /home/duke/aa/scripts/test.shovunque all'interno della voce sudoers?
Dukevin,

1

Suppongo che la causa sia che avvii la sessione dello schermo come un altro utente rispetto al tuo utente del server web (possibilmente www-data), ma poiché lo script verrà eseguito come utente del server web quando avviato tramite il browser, non ha il diritto di inviare comandi alla sessione schermo di un altro utente.

Come risolverlo dipende da come è stata inizialmente avviata la sessione dello schermo. Se è possibile avviarlo come utente del server Web, questa sarà la soluzione più semplice, ma altre opzioni potrebbero includere sudo o misure più complicate (*). Dicci di più su ciò che stai facendo, in modo che possiamo dare suggerimenti utili.

(*) Ho visto una "soluzione" per questo tipo di problema in cui lo script PHP avrebbe scritto un file speciale, che è stato rilevato da un cronjob che ha iniziato a funzionare solo quando il file era presente ...


SvenW, le sessioni dello schermo sono state avviate con l'account root, quindi ho modificato il codice php in modo che assomigli a questo. exec("sudo /home/duke/aa/scripts/test.sh");Tuttavia, non ho ancora fortuna. Qualche altro suggerimento prima di provare ad avviare le sessioni con www-data?
dukevin,

Hai inserito i dati www nel file del sudoer?
Sven,

sì, ecco come appare il mio file sudoer: pastebin.com/HMKw72Z8
dukevin,

1
@Kevin: di sudoper sé non cambia completamente l'ambiente dell'utente, ad es. Prova sudo who am ie otterrai comunque informazioni sull'utente originale e su pty. Tuttavia, puoi dire screenquale utente utilizzare, ad es screen -r sessionowner.
Tom Shaw,

@ Tom: whocontrolla il file utmp , ma screenusa solo l'UID corrente, quindi quest'ultimo dovrebbe funzionare bene sudo.
gravità
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.