skrypt PHP i wykonanie polecenia na serwerze dedykowanym - screen

Potrzebujesz pomocy z C, C++, perl, python, itp.
gacek.pl
Posty: 28
Rejestracja: 01 grudnia 2009, 20:28

skrypt PHP i wykonanie polecenia na serwerze dedykowanym - screen

Post 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.
life
Posty: 60
Rejestracja: 03 listopada 2008, 11:00

Post 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.
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post 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.
gacek.pl
Posty: 28
Rejestracja: 01 grudnia 2009, 20:28

Post 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
Rutek
Posty: 6
Rejestracja: 20 marca 2010, 17:57

Post 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);
}
life
Posty: 60
Rejestracja: 03 listopada 2008, 11:00

Post 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?
gacek.pl
Posty: 28
Rejestracja: 01 grudnia 2009, 20:28

Post 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.
Rutek
Posty: 6
Rejestracja: 20 marca 2010, 17:57

Post 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);
}
gacek.pl
Posty: 28
Rejestracja: 01 grudnia 2009, 20:28

Post 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.
Rutek
Posty: 6
Rejestracja: 20 marca 2010, 17:57

Post 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';
}
ODPOWIEDZ