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/.
Witajcie!
Stworzyłem sobie serwer na sockiecie. Utworzyłem plik serwer.sh a w nim umieściłem takie coś (w celu testu/wyświetlenia przez klienta):
#!/bin/bash uptime
Serwer uruchamiam za pomocą xinetd na porcie 3333, wszystko jest ok i działa.
Klienta chcę mieć w PHP, w tym celu stworzyłem plik klient.php, a w nim umieściłem taki kod:
<?php $host="localhost" ; $port=3333; $i = 'wysylam ten napis'; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $result = socket_connect($socket, $host, $port); echo "Wysylam: $i<br />"; socket_write($socket, $i, strlen($i)); $input = socket_read($socket, 2048); echo "Odpowiada: $input"; ?>
I oto chodzi. Jak zapewne zauważyliście skrypt wysyła do socketa treść 'wysylam ten napis'. I stąd moje pytanie.
W jaki sposób mogę odczytać ten tekst przesłany w pliku serwer.sh, tak aby później wykonywać określone akcje itp, chcę go tylko wyświetlić.
Czytałem trochę u wujka, ale nic szczególnego (bynajmniej działającego) nie znalazłem. Przykładowy kod, jaki znalazłem, ale nie wiem czy jest błędny, czy to nie do tego służy ale nie działa. Podam go:
exec 3<>/dev/tcp/127.0.0.1/3333 cat <&3
Bardzo proszę o jakieś propozycje, rozwiązania w jaki sposób mogę to zrobić, aby wyświetlić wysyłaną treść w pliku serwer.sh
Dziękuję z góry za wszelkie odpowiedzi.
Pozdrawiam.
Ostatnio edytowany przez desavil (2011-09-09 18:22:02)
Offline
http://www.troubleshooters.com/codecorn/sockets/
a tu wujek mówi, że można po prostu użyć read
Offline
Niestety nie, dodałem w pliku zamiast uptime wpis read i skrypt w php się zapętla i nie działa strona.
Offline
Jeśli dobrze zrozumiałem tak na szybko tego daemona to chyba masz coś takiego w konfiguracji
server = serwer.sh
Hmm... http://www.troubleshooters.com/codecorn/sockets/
Jeśli tak to wystarczy czytać stdin i pisać do stdout... Jest to prawdą, bo "uptime" tam pisze. Więc spróbuj
http://stackoverflow.com/questions/212965/how-to-re … nt-one-out-in
Możesz też próbować
read ff
echo $ff
Ale mnie to nie działa należycie w bashu, tj. echo "oo" | read ff && echo $ff
Offline
#!/bin/bash cat /dev/stdin
Zwraca w php:
Odpowiada: cat: /dev/stdin: No such device or address
Natomiast:
#!/bin/bash read ff echo $ff
Zapętla skrypt PHP i ładuje się cały czas.
W pliku /etc/xinetd.conf mam coś takiego:
service serwer { port = 3333 socket_type = stream wait = no user = nobody server = /root/serwer.sh log_on_success += USERID log_on_failure += USERID disable = no }
Ostatnio edytowany przez desavil (2011-09-09 19:34:36)
Offline
Samo "cat" powinno zadziałać chyba.
#!/bin/bash myvar=`cat` echo "$myvar""NIC"
Ewentualnie zamiast /dev/stdin spróbuj /proc/self/fd/0
Ostatnio edytowany przez NIC (2011-09-09 19:39:47)
Offline
Pierwsze nie działa (zapętla skrypt, strona długo się ładuje) :( nie wiem co z tym jest.. ://
@edit: zmieniłem z `cat` na "cat" i wyświetliło catNIC
Drugie:
Odpowiada: cat: /proc/self/fd/0: No such device or address
Ostatnio edytowany przez desavil (2011-09-09 19:51:08)
Offline
Zamiast swojego "serwer.sh" wstaw dla testu "tee". Powinien skopiować stdin na stdout. Jeśli tak to znaczy że xinetd działa poprawnie.
Możesz wtedy spróbować użyć użyć tee w skrypcie, ale myślę że problemem jest że skrypt nie może być tu użyty, gdyż nie czyta on stdin. Potrzeba coś takiego jak tee lub grep, co można strumieniować. (echo "ls /" | bash - spowoduje wykonanie komendy, a tego nie chcesz, być może w tej chwili to działa tak: echo -en "lsfggg / \n ls" | bash)
Offline
Ale gdzie wstawić to "tee"??
Tutaj??:
service serwer { port = 3333 socket_type = stream wait = no user = nobody server = tee log_on_success += USERID log_on_failure += USERID disable = no }
Bo tak to nie działa coś wgl.
Offline
Wiesz co... W zasadzie widzę że te skrypty bashowe jednak z tym działają. Brakuje Ci więc chyba tylko entera w wysyłanej wiadomości do serwera.Wtedy "read" nie powinien się "zapętlać"
$i = 'wysylam ten napis'."\n";
Offline
Jesteś WIELKI!
Dzięki bardzo! :]
Offline
Jeszcze jedno.
Wiesz może jak odczytać jeżeli użyję PHP:
#!/usr/bin/php5 <?php COS_CO_CZYTA ?>
Offline
Dokładnie takie samo podejście: trzeba czytać z stdin:
Np. jak z pliku: http://pl2.php.net/manual/en/features.commandline.io-streams.php
Może z tą funkcją będzie ładniej/łatwiej: http://pl2.php.net/manual/en/function.file-get-contents.php
Offline
Jak zwykle działający i oczekiwany rezultat :)
PS. Czy jeżeli w ten sposób będę sobie uruchamiał na serwerze aplikacje będzie to bezpieczne?
Aplikacja będzie uruchomiona przez jakiego użytkownika, jeżeli socket padnie usługi też się wyłączą?
Jak jest z bezpieczeństwem takiego czegoś, czy ktoś może w jakiś sposób nasłuchiwać port na jakim działa socket i w jakiś sposób podczas komunikacji serwera A (serwer) - B (klient) można się włamać i dokonać nieoczekiwanych operacji, jak się chronić.
Ostatnio edytowany przez desavil (2011-09-10 15:54:41)
Offline
Zależy co taki serwis ma robić. Jeśli umożliwia modyfikowanie treści na serwerze to jest to niebezpieczne. Tylko read-only wydaje się sensowne, np. repozytorium git'a do klonowania/uaktualniania.
Użycie standardowego portu jest bardzo niebezpieczne, jak już to wylosuj jakąś dużą liczbę i sprawdź w /etc/services czy jest coś tam przypisane. Najlepiej podszyć się pod jakąś usługę, np. 9216 - ACME - wtedy atakujący jest zmylony. Bo z tego co mi wiadomo można skanować po portach i znaleźć ten aktywny.
Wydaje się mi że wystarczy w skrypcie zrobić proste logowanie (może być użycia klucza tak jak w SSH/kartach dostępowych się robi) i autoryzację na np. 5 minut na IP, najlepiej na kilka znanych IP. (o ile usługa ma być tylko dla siebie)
Najlepiej by użytkownik uruchamiający usługę był to nowy użytkownik w systemie, niemający praw praktycznie do wszystkiego (np. po co mu dostęp do Audio...) i z quotą na miejsce dyskowe. Najlepiej także ograniczyć czas procesora i inne zasoby. To zminimalizuje niebezpieczeństwo dość znaczne.
Innymi słowy zaczyna się robić z tego taki telnet czy serwer www...
Offline