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ć [b]read[/b]
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-read-mutliline-input-from-stdin-into-variable-and-how-to-print-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
Time (s) | Query |
---|---|
0.00011 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00119 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.147.53.90' WHERE u.id=1 |
0.00076 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.147.53.90', 1732779109) |
0.00045 | SELECT * FROM punbb_online WHERE logged<1732778809 |
0.00045 | SELECT topic_id FROM punbb_posts WHERE id=180948 |
0.00106 | SELECT id FROM punbb_posts WHERE topic_id=19671 ORDER BY posted |
0.00081 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=19671 AND t.moved_to IS NULL |
0.00004 | SELECT search_for, replace_with FROM punbb_censoring |
0.00095 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=19671 ORDER BY p.id LIMIT 0,25 |
0.00078 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=19671 |
Total query time: 0.00664 s |