Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam,
Jestem informatykiem z zamiłowania i szkoły (PK Inf 2 rok). Mam ciekawy problem, który wydaje się być bardzo prosty do rozwiązania... ale niestety w moim przypadku tak nie jest...
---------------------------------------------------------
Zadanie:
Napisać skrypt w PHP pobierający dane z programu nc.
---------------------------------------------------------
Rozwiązanie:
Z pomocą przychodzi nam funkcja PHP shell_exec, która może wyświetlać wyniki,które widzimy w bashu łącząc się przez SSH.
Przykładowy kod:
<?php
$output = shell_exec('nc -v -z linux.pl 80');
echo "<pre>$output</pre>";
?>
---------------------------------------------------------
Problem:
funkcja shell_exec nie zwraca żadnych wyników dla programu nc. Natomiast jeżeli jako komendę wpisze listowanie plików: (shell_exec('ls -lart');) to na ekranie bardzo ładnie ukaże się zawartość katalogu.
---------------------------------------------------------
Moje pytanie:
Dlaczego u mnie nie chce się nic pokazać, jeżeli listowanie plików działa i kilka innych komend. Nawet ping po skróceniu jego działania (np: -c 4) ładnie wyświetla się na stronie.
---------------------------------------------------------
Moja walka:
Próbowałem zapisywać plik po przez (>) nawet na kilku powłokach (2>&1) i niestety nic nie było zwracane...
Jeżeli natomiast wpiszę te same dane w bashu to wszystko ładnie chodzi, plik jest zapisywany i zawiera treść.
---------------------------------------------------------
Moja maszyna:
Serwer w OVH kimstufii XXL wraz z panelem Direct Admin.
Proszę o pomoc bo nie mam pojęcia co może być przyczyną.
Jeżeli brakuje jakichś informacji proszę pisać a na pewno je zamieszczę i każdą propozycje rozwiązania problemu przetestuje.
Offline
niezbyt eleganckie, ale może zadziałać: zrób tak, żeby wynik działania nc został zapisany do jakiegoś tymczasowego pliku, i następnie zawartość tego pliku wywal na ekran
Offline
rychu tak robiłem... Opisałem to w moja walka... Plik zapisywałem i potem próbowałem odczytać po przez PHP ale niestety kiedy wywołuję nc z shell_execa (PHP) nie jest tworzony ten plik :/
Tak wyglądała moja komenda:
nc -v -z -i 2 -w 2 adres.pl 21 22 80 >nc_exit 2>&1
I nc_exit w ogóle nie był tworzony:/ a jeżeli takie coś zrobię w bashu to wszystko działa. Dodam że jest to robione w obrębie tego samego konta (usera)
Offline
robson_ek napisał(-a):
a jeżeli takie coś zrobię w bashu to wszystko działa. Dodam że jest to robione w obrębie tego samego konta (usera)
Ja tam się nie znam, ale skrypty PHP bardzo często działają na ograniczonych uprawnieniach, nawet jeżeli wykonywane są z katalogu public_html użytkownika.
Spróbuj zalogować się przez SSH (bo rozumiem masz taki dostęp) i uruchomić:
/usr/bin/php /sciezka/do/Twojego/skryptu.php
Offline
Wątpię, żeby to akurat pomogło, ale podobno (o php to ja bardziej słyszałem, niż praktykowałem) argumenty należy podawać w escapeshellarg().Spróbuj też zamiast shell_exec() np. exec() lub system().
Rozwiązanie obrzydliwie barbarzyńskie — przez php wywołać skrypt powłoki. Ale to ostateczność.
Offline
zadziala:
system('nc -v -z linux.pl 80 2>&1');
problem polega na tym ze nc pisze na stderr ... a w shell_exec nie mozna przekierowywac strumieni - zwroc uwage na roznice pomiedzy system() a shell_exec() - np.:
system('for f in `seq 20 30`; do echo $f; done'); shell_exec('for f in `seq 20 30`; do echo $f; done');
(uwaga: jezeli php chodzi w trybie bezpiecznym przekierowania stryumieni w sysstem nie beda dzialac)
Offline
bercik jesteś WIELKI
Serdeczne Ci bóg zapłać ;D
Ostatnio edytowany przez robson_ek (2008-07-24 16:49:12)
Offline
Strony: 1