ďťż
 
 
   skrypt PHP i wykonanie polecenia na serwerze dedykowanym - screen
 
 

Tematy

 
    
 

 

 

 

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • minister.pev.pl

  •  

     


     

     
    Copyright 2003. MĂłj serwis