|
skrypt PHP i wykonanie polecenia na serwerze dedykowanym - screen
gacek.pl - 17-03-2010 22:48
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.:
screen -A -m -d -S serwer ./jakieś tam polecenie[$PORT] bla bla...
Próbowałem coś takiego:
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 - 20-03-2010 11:29
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 $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.
lessmian2 - 20-03-2010 13:57
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 - 20-03-2010 16:50
Gdy wkleje do pliku "p.php" to:
else{ shell_exec("komenda -port $_POST[port]"); }
to wyskakuje mi to Parse error: syntax error, unexpected T_ELSE in /var/www/p.php on line 3
a gdy wkleje to : $output = shell_exec("/sciezka/do_pliku/komenda -port $_POST[port]"); var_dump($output);
To wywala mi : NULL
Rutek - 20-03-2010 18:14
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:
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:
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:
shell_exec("komenda -port $_POST[port]");
zamień na:
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
$_POST['port']
jest liczbą i tylko w takim przypadku wywołanie tego kodu. Wyglądałoby to tak (pisane z palca):
// 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 - 20-03-2010 18:15
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 - 20-03-2010 18:48
life zrobiłem tak jak mówiłeś.
Wpisałem też to:
// 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 - 20-03-2010 18:57
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: <?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 - 20-03-2010 19:40
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.:
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 - 20-03-2010 20:08
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): <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: <?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'; }
gacek.pl - 21-03-2010 18:18
Rutek dokładnie o takie coś mi chodziło, zrobiłem tak jak pisałeś wszystko jest niby dobrze, polecenie ,,echo'' odpowiada lecz zerkam na serwer dedykowany w htop i polecenie jednak się nie uruchamia. Czego może to być wina? Czy coś w poleceniu może jest jeszcze nie tak?
W p.php napisałem:
<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>
W wykonaj.php napisałem:
<?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('MOJA KOMENDA -port '.$port); echo 'Wykonano zadanie'; }
Czy w wykonaj.php musi być zakończenie skryptu znakiem:
"?>"
bo bez i z końcówka nie wykonuje polecenia na serwerze dedykowanym..
Rutek - 21-03-2010 21:04
Wszędzie w internecie znajdziesz z:
"?>"
ale Zend, który wkłada od groma roboty w rozwijanie PHP, zaleca nie używać tego zakończenia. Wyświetla coś poza tekstem:
Wykonano zadanie
Polecenie to ma ciągle działać? Jeżeli tak, to w tym momencie zakończenie działania skryptu PHP równa się zakończeniu działania polecenia. Jeżeli chcesz, aby te dwie rzeczy nie były od siebie zależne, musisz to wykonać tak:
<?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 $_POST['port'] będzie np. tekstem if($port > 0) { $spec = array(array("pipe", "r")); $proc = proc_open('MOJA KOMENDA --port '.$port, $spec, $pipes, shell_exec('pwd')); echo 'Wykonano zadanie'; }
zanotowane.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|