Strona 1 z 2

skrypt PHP i wykonanie polecenia na serwerze dedykowanym - screen

: 17 marca 2010, 22:48
autor: gacek.pl
Witam.
Czy byłby ktoś tak uprzejmy i spróbował mi pomoc bo coś nie daję rady.
Mój problem polega na tym, chciałem przez www wpisać tylko PORT np. serwera i np. kliknąć OK czy ZATWIERDŹ i na serwerze dedykowanym aby mi się wykonało polecenie np.:

Kod: Zaznacz cały

screen -A -m -d -S serwer ./jakieś tam polecenie[$PORT] bla bla...
Próbowałem coś takiego:

Kod: Zaznacz cały

else{
shell_exec("komenda -port $_POST[port]");
}
Ale jednak mi coś nie wychodziło, wyświetla błąd przy otwieraniu www.

Mam nadzieję, że moje wytłumaczenie problemu jest zrozumiałe. I jeśli komuś się nudzi a wie jak to zrobić byłbym bardzo wdzięczny za pomoc.

Pozdrawiam.

: 20 marca 2010, 11:29
autor: life
Po pierwsze sprawdź czy w konfigu php nie masz wyłączonej funkcji, możesz też zrobić to przez phpinfo(); jest tam sekcja listująca zablokowane funkcje.
jak nie jest wyłączona to podaj może pełną ścieżkę do binarki, zobacz też co zwraca funkcja

Kod: Zaznacz cały

$output = shell_exec("/sciezka/do_pliku/komenda -port $_POST[port]");
var_dump($output);
no i przede wszystkim sprawdź czy komenda jest poprawna tzn puść ją na konsole czy działa jak trzeba.

: 20 marca 2010, 13:57
autor: lessmian2
gacek.pl pisze:wyświetla błąd przy otwieraniu www
To może pokazałbyś ten błąd? Tam zazwyczaj dokładnie jest napisane co jest nie tak.

: 20 marca 2010, 16:50
autor: gacek.pl
Gdy wkleje do pliku "p.php" to:

Kod: Zaznacz cały

 else{
shell_exec("komenda -port $_POST[port]");
} 
to wyskakuje mi to

Kod: Zaznacz cały

Parse error:  syntax error, unexpected T_ELSE in /var/www/p.php  on line 3
a gdy wkleje to :

Kod: Zaznacz cały

 $output = shell_exec("/sciezka/do_pliku/komenda -port $_POST[port]");
var_dump($output); 
To wywala mi :

Kod: Zaznacz cały

NULL

: 20 marca 2010, 18:14
autor: Rutek
Gacek, nie znam Twojego poziomu pod względem programowania, więc potraktuję Cię jako bardzo początkującego. Jeżeli się mylę, z góry przepraszam.
Błąd:

Kod: Zaznacz cały

Parse error:  syntax error, unexpected T_ELSE in /var/www/p.php  on line 3
Oznacza, że masz w kodzie problem ze składnią (zapisem wszystkiego według ustalonych zasad). Samo:

Kod: Zaznacz cały

 else{
shell_exec("komenda -port $_POST[port]");
}
Nie ma prawa bytu, gdyż jest to kawałek kodu, którego 2/3 linii jest tutaj totalnie niepotrzebne. Wystarczy, że usuniesz pierwszą i ostatnią linię kodu. Do tego:

Kod: Zaznacz cały

shell_exec("komenda -port $_POST[port]");
zamień na:

Kod: Zaznacz cały

shell_exec('komenda -port '.$_POST['port']);
Chciałbym również podkreślić niebezpieczeństwo korzystania z tego w takiej formie: do powłoki (ang. shell) przekazujesz dane od użytkownika, których w żaden sposób nie weryfikujesz, przez co ktoś może wykonać dowolną komendę. Najprostszym rozwiązaniem będzie sprawdzenie, czy wartość zmiennej

Kod: Zaznacz cały

$_POST['port']
jest liczbą i tylko w takim przypadku wywołanie tego kodu. Wyglądałoby to tak (pisane z palca):

Kod: Zaznacz cały

// Wymuszamy typ integer(liczbowy) na pobranych danych
$port = (int)$_POST['port'];
// Port nie może być zerowy, więc nie wykonujemy komendy
// Również wartość równoznaczną z zerem zmienna $port przyjmie w przypadku, kiedy będzie np. tekstem
if($port > 0) {
    shell_exec('komenda -port '.$port);
}

: 20 marca 2010, 18:15
autor: life
To może pokaż tą linijkę nr3, w której jest błąd.

A wklejając to co napisałem to chyba nie zrobiłeś tego dosłownie tylko ze swoim poleceniem i parametrami?

: 20 marca 2010, 18:48
autor: gacek.pl
life zrobiłem tak jak mówiłeś.

Wpisałem też to:

Kod: Zaznacz cały

// Wymuszamy typ integer(liczbowy) na pobranych danych
$port = (int)$_POST['port'];
// Port nie może być zerowy, więc nie wykonujemy komendy
// Również wartość równoznaczną z zerem zmienna $port przyjmie w przypadku, kiedy będzie np. tekstem
if($port > 0) {
    shell_exec('komenda -port '.$port);
}
I tylko po odświeżeniu zobaczyłem czysta stronę ,,białe tło''.

Dziękuję za pomoc ale chyba nic z tego nie będzie albo ja źle to robię bo nie kapuje albo coś jest nie tak.

: 20 marca 2010, 18:57
autor: Rutek
Bo powinno się pokazać białe tło. ;-) Jeżeli chcesz wyświetlić wynik, to wystarczy dodać wyświetlanie wartości zwracanej przez funkcję shell_exec.
Gotowiec:

Kod: Zaznacz cały

<?php
// Wymuszamy typ integer(liczbowy) na pobranych danych
$port = (int)$_POST['port'];
// Port nie może być zerowy, więc nie wykonujemy komendy
// Również wartość równoznaczną z zerem zmienna $port przyjmie w przypadku, kiedy będzie np. tekstem
if($port > 0) {
    echo shell_exec('komenda -port '.$port);
}

: 20 marca 2010, 19:40
autor: gacek.pl
Wy chyba źle mnie zrozumieliście.

Chodziło mi o takie coś, że mam gotowe polecenie otwieram np. p.php, mam okienko wpisuję np. tam 1234 potem np. klikam OK i uruchamia mi się dane polecenie np.:

Kod: Zaznacz cały

screen -A -m -d -S serwer ./komenda [TU PORT WPROWADZONY PRZEZ WWW]+ coś_tam
Rutek, dziękuję za gotowca ale i tak biała strona tylko. Przepraszam, że tak truję ale niezbyt ogarnięty jestem w tych skryptach.

: 20 marca 2010, 20:08
autor: Rutek
Ten kod, co Ci dałem wyżej, zapisz pod postacią pliku wykonaj.php. Formularz zapisz do tego p.php, którego treść ma wyglądać tak(pomijam nagłówki XHTML i tym podobne):

Kod: Zaznacz cały

<form action="wykonaj.php" method="post">
<fieldset>
    <legend>Wykonaj komendę</legend>
    <label for="port">Port</label>
    <input type="text" name="port" id="port" />
    <input type="submit" value="Wykonaj" />
    </fieldset>
</form>
Oczywiście nie zapomnij w pliku wykonaj.php zmienić komendy.

Białe tło będzie się nadal wyświetlać, jeżeli polecenie nie zwróci do powłoki żadnego komunikatu. Zapewne tak będzie, bo widzę, że w screenie chcesz to umieścić, więc możesz dodać wyświetlanie komunikatu potwierdzającego wykonanie zadania w wykonaj.php:

Kod: Zaznacz cały

<?php
// Wymuszamy typ integer(liczbowy) na pobranych danych
$port = (int)$_POST['port'];
// Port nie może być zerowy, więc nie wykonujemy komendy
// Również wartość równoznaczną z zerem zmienna $port przyjmie w przypadku, kiedy będzie np. tekstem
if($port > 0) {
    echo shell_exec('komenda -port '.$port);
    echo 'Wykonano zadanie';
}