2014-10-31 2 views
15

Ho una sessione TMUX che esegue un server Minecraft e sto creando un'interfaccia Web per il server.Impossibile inviare comandi a una sessione TMUX da PHP

Attualmente ho i seguenti documenti:

command.sh

#!/bin/bash 
tmux send-keys -t minecraft C-z "[email protected]" Enter 

index.php

<?PHP 
    if($_POST) { 
     $commandString = $_POST['inputCommand']; 
     $output = shell_exec('./command.sh $commandString'); 
     echo "<pre>$output</pre>"; 
     } 
?> 
    <form method="post"> 
     <input type="text" name="inputCommand" placeholder="Type Command"/> 
     <input type="submit" value="Execute" /> 
    </form> 

command.sh lavora in un terminale in che posso utilizzare tutti i comandi standard nel modo

./command.sh "/help" 

Tuttavia non è possibile eseguire questo script da php utilizzando la metodologia sopra riportata. Ho aggiunto due www-data e www-utente a sudoers e ha tentato di

shell_exec('sudo ./command.sh $commandString')

Ma che non ha funzionato neanche.

Quando si fa clic sul pulsante di invio, l'eco viene emessa ma è vuota.

Qualcuno può aiutare a indicare dove la mia metodologia per l'esecuzione dello script è andata storta?


EDIT Ho preso due screenshot, uno prima e uno dopo per chiarire ulteriormente.

enter image description here

+2

Cosa non va? stai ricevendo un errore? Cosa ottieni come output? Quali comandi stai cercando che falliscono? Ti rendi conto che questo è un * buco di sicurezza * spalancato *? –

+0

Nessun errore, l'output è vuoto, i comandi sono sopra. Questo non restituisce letteralmente nulla e il comando non viene eseguito. Ecco perché sono così perplesso e postato qui Sì, comprendo le implicazioni sulla sicurezza, questo è dietro a due schermate di accesso separate. –

+0

@EtanReisner si prega di vedere sopra, ho postato uno screenshot per chiarire –

risposta

9

command.sh sta avendo un problema e l'output qualcosa da stderr. shell_exec restituisce solo lo stdout, quindi non visualizzi l'errore. Prova aggiungendo "2> & 1" alla fine del comando, come

$output = shell_exec('./command.sh $commandString 2>&1'); 

Questo invierà stderr su stdout e farvi vedere cosa sta succedendo. Rimuovi il "2> & 1" dopo aver risolto il problema. Come indicato nei commenti, immagino che il problema attuale sia che si utilizzano le virgolette singole, il che significa che $ commandString viene interpretato letteralmente. Prova invece le doppie virgolette!

Avviso !!! Questo è davvero insicuro. Stai trasmettendo un parametro non richiesto ottenuto da POST a un comando in esecuzione come utente in sudoers. Indipendentemente dalle due schermate di accesso, è necessario disinfettare il proprio input.

+8

In realtà, * come scritto *, questo è perfettamente sicuro - non c'è nessuna sostituzione variabile in corso. Il comando in esecuzione è una stringa costante. E questo potrebbe essere il motivo per cui il comportamento non è come previsto. "Fixing", ovviamente, introdurrà la vulnerabilità avvertita. –

+4

Ho usato il tuo precedente suggerimento di reindirizzare l'errore standard allo standard out, ho scoperto che TMUX non è riuscito a trovare la stringa, l'ho modificata in su -c command e ha funzionato. Ho anche trovato un modo migliore circa 10 minuti dopo che questo ha funzionato in quel minecraft ha una funzione Rcon integrata e l'ho usato per comunicare attraverso i moduli di post php. Quindi, niente shell_exec e tutto molto più sicuro. –

+0

@MichaelBetterton Awesome Sono felice di poterti aiutare e spero che le tue esperienze future su SO non coinvolgano più meta thread che discutono di cosa è OK :) – ErlVolton