Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [bash][PHP]
Forum PHP.pl > Forum > Przedszkole
Paranoid Android
Witam
Mam mały problem z uruchamianiem poleceń w bash z poziomu strony internetowej napisanej w php.
Generalnie polecenia wyświetlające dane np $ls , $date itp działają prawidłowo tzn wysyłają odpowiedź na przeglądarkę.
Problem natomiast jest w tym ze chce stworzyć php które będzie uruchamiał komendę na serwerze na którym jest postawiona ów strona.
Np prosty skrypt uruchamiający wysuwanie tacki CD po wcześniejszym kliknięciu na przycisku w stronie PHP .
Niestety nie działa.

CODE
<?
echo (shell_exec("eject"));
?>


Rozumiem że może to być kwestia uprawnień w systemie linux
Próbowałem nadać wszystkim plikom $chmod 777 oraz $chmod +x
Niestety bezskutecznie
Proszę o pomoc. PARANOID ANDROID
PS
GOOGLE w tym temacie zawiodło.
piotrooo89
jak mogłeś nadać wszystkiemu 777? toż to przestanie działać system, a co do tego polecenia, być może użytkownik www-data nie jest uprawniony do wykonania go? możesz spróbować uruchamiać takie polecenie przez sudo ale nie wiem czy jest to najlepsze rozwiązanie.
Paranoid Android
Nie wszystkim w systemie tylko w katalogu public_html i to tylko na test
Czy jak dodam www-data do grupy to będę miał automatycznie uprawnienia do wykonania z poziomu strony php?
piotrooo89
przypuszczam że tak (nie sprawdziłem tego) tylko wtedy wykonanie będziesz musiał zrobić za pomocą sudo polecenie.
Paranoid Android
ok za chwile sprawdzę i dam odpowiedz
Paranoid Android
niestety sudo chown www-data:www-data skrypt.php nie pomogło
piotrooo89
ale tu nie chodzi o takie nadanie praw, tylko takie: http://jakilinux.org/administracja/tajniki-pliku-sudoers/
Paranoid Android
ok sprawdzam

niestety po edycji visudo nic nie pomogło
piotrooo89
1. sprawdź co masz w error.log w apache
2. www-data ALL = NOPASSWD:/usr/bin/eject taki wpis musisz mieć w sudoers

u mnie to działa.
Gość
eject: unable to open `/dev/sr0'
[Tue Jan 17 17:19:38 2012] [error] [client 127.0.0.1] File does not exist: /home/paranoidandroid/Publiczny/www/favicon.ico

Wygląda na to ze chce wysłać sygnał do /dev/sr0 czyli cdrom ale tak jak by nie widział sprzętu
PS
Sprawdzałem w systemie i sprzęt jest ok
Paranoid Android
ls -l /dev/
brw-rw----+ 1 root cdrom 11, 0 2012-01-17 17:06 sr0

Zmieniłem komende eject na killall conky (zabijanie procesów conky).
Właczyłem conky
Uruchamiam index.php i nic sie niedzieje a $cat /var/log/apache2/error.log wyrzuca
conky(2986): Operation not permitted
conky: no process found

Jakieś pomysły?

PS znalazłem tez informacje ze można obejść problem zastępując bezpośrednio PHP>BASH na PHP>C++>BASH
piotrooo89
miałem ten sam problem, ale wpis w /etc/sudoers i wywołanie polecenia za pomocą sudo pomogło. pokaż jakie masz wpisy w sudoer i jak wywołujesz komendę.
Paranoid Android
Wpis w /etc/sudoers przy pomocy $sudo visudo

www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u użytkownik /home/użytkownik/ścieżka_docelowa/skrypt.sh

Jako użytkownika mam wpisanego tego na którym jest postawiony serwer apache
index.php
CODE
<?
echo shell_exec("sh /home/użytkownik/ścieżka_docelowa/skrypt.sh");
?>


skrypt.sh zawiera prosta komendę :
eject lub killall cośtam itp
piotrooo89
no to wy edytuj z poziomu sudo, np: sudo vim /etc/sudoers dodając taką linie:

Kod
www-data ALL = NOPASSWD:/usr/bin/eject


i później w php, z poziomu apache:

  1. exec("sudo eject");


i nie będziesz musiał jakiś pośredniczących proxy-skryptów w shellu robić do tego.
Paranoid Android
Wiem do czego zmierzasz tylko nie wiem co masz na myśli "edytować php z poziomu apache"?
wstydnis.gif
piotrooo89
chodziło mi o odpalenie z poziomu apache czyli wpisując adres w przeglądarkę.
Paranoid Android
Tak trafiłeś w sedno
Edycja z poziomu przeglądarki wystarczyła żeby zadziałało
Dzięki za pomoc specool.gif .
Dla zainteresowanych podaje krótki skrypt edytora php uruchamianego w przeglądarce

edytuj.php
CODE
<?php
$katalog = opendir("./");
while ($plik = strtolower(readdir($katalog))) {
if ($plik<>"." && $plik<>".." && $plik<>"edytuj.php" ) $lista[]=$plik;
}
closedir($katalog);
if (count($lista)>0) {
echo "Wybierz plik do edycj:";
sort($lista);
}

for ($i=0;$i<count($lista);$i++) {
echo "<br />Edytuj plik <b>$lista[$i]</b> <a href=\"edytuj.php?edycja=$lista[$i]\">Edytuj plik</a>";
}


// zmiana zawartosci pliku
$edycja = $_REQUEST["edycja"];
if (isset($_POST["tekst"]) && file_exists($edycja)) {
$f = fopen($edycja, "w");
fputs($f, stripslashes($_POST["tekst"]));
fclose($f);
}



// umieszczenie pliku w formularzu
if ($edycja<>"" && file_exists($edycja)) {
echo "<p> </p>Edycja plik: <b>$edycja</b>";
echo '<form action="edytuj.php" method="post"><input type="hidden" name="edycja" value="'.$edycja.'" /><textarea name="tekst" rows="20" cols="50">';
$f = fopen($edycja,"r");
while(!feof($f)) echo fread($f,1024);
fclose($f);
echo '</textarea><input type="submit" value="Zapisz" /></form>';
}
?>


PS
Plik nazywamy edytuj.php nie inaczej
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.