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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2011-09-09 18:21:03

  desavil - Użytkownik

desavil
Użytkownik
Zarejestrowany: 2010-11-02

[bash] Socket - wyświetlanie.

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):

Kod:

#!/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:

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:

Kod:

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

 

#2  2011-09-09 18:54:58

  keddie - Użytkownik

keddie
Użytkownik
Skąd: localhost
Zarejestrowany: 2008-04-22

Re: [bash] Socket - wyświetlanie.

http://www.troubleshooters.com/codecorn/sockets/
a tu wujek mówi, że można po prostu użyć [b]read[/b]

Offline

 

#3  2011-09-09 19:22:44

  desavil - Użytkownik

desavil
Użytkownik
Zarejestrowany: 2010-11-02

Re: [bash] Socket - wyświetlanie.

Niestety nie, dodałem w pliku zamiast uptime wpis read i skrypt w php się zapętla i nie działa strona.

Offline

 

#4  2011-09-09 19:24:26

  NIC - Członek DUG

NIC
Członek DUG
Skąd: Wrocław
Zarejestrowany: 2006-12-25
Serwis

Re: [bash] Socket - wyświetlanie.

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


Stronka-dom: [url]http://titek.victorygames.pl[/url]
Jabber: nic@jabster.pl
Hobby: kompilowanie Linuksa, Bluetooth
Dystrybucja: żadna, bliski krewny LFS, składak

Offline

 

#5  2011-09-09 19:29:40

  desavil - Użytkownik

desavil
Użytkownik
Zarejestrowany: 2010-11-02

Re: [bash] Socket - wyświetlanie.

Kod:

#!/bin/bash
cat /dev/stdin

Zwraca w php:
Odpowiada: cat: /dev/stdin: No such device or address

Natomiast:

Kod:

#!/bin/bash
read ff
echo $ff

Zapętla skrypt PHP i ładuje się cały czas.


W pliku /etc/xinetd.conf mam coś takiego:

Kod:

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

 

#6  2011-09-09 19:39:22

  NIC - Członek DUG

NIC
Członek DUG
Skąd: Wrocław
Zarejestrowany: 2006-12-25
Serwis

Re: [bash] Socket - wyświetlanie.

Samo "cat" powinno zadziałać chyba.

Kod:

#!/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)


Stronka-dom: [url]http://titek.victorygames.pl[/url]
Jabber: nic@jabster.pl
Hobby: kompilowanie Linuksa, Bluetooth
Dystrybucja: żadna, bliski krewny LFS, składak

Offline

 

#7  2011-09-09 19:47:13

  desavil - Użytkownik

desavil
Użytkownik
Zarejestrowany: 2010-11-02

Re: [bash] Socket - wyświetlanie.

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

 

#8  2011-09-09 20:47:19

  NIC - Członek DUG

NIC
Członek DUG
Skąd: Wrocław
Zarejestrowany: 2006-12-25
Serwis

Re: [bash] Socket - wyświetlanie.

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)


Stronka-dom: [url]http://titek.victorygames.pl[/url]
Jabber: nic@jabster.pl
Hobby: kompilowanie Linuksa, Bluetooth
Dystrybucja: żadna, bliski krewny LFS, składak

Offline

 

#9  2011-09-09 20:53:33

  desavil - Użytkownik

desavil
Użytkownik
Zarejestrowany: 2010-11-02

Re: [bash] Socket - wyświetlanie.

Ale gdzie wstawić to "tee"??

Tutaj??:

Kod:

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

 

#10  2011-09-09 21:37:25

  NIC - Członek DUG

NIC
Członek DUG
Skąd: Wrocław
Zarejestrowany: 2006-12-25
Serwis

Re: [bash] Socket - wyświetlanie.

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";


Stronka-dom: [url]http://titek.victorygames.pl[/url]
Jabber: nic@jabster.pl
Hobby: kompilowanie Linuksa, Bluetooth
Dystrybucja: żadna, bliski krewny LFS, składak

Offline

 

#11  2011-09-09 21:46:43

  desavil - Użytkownik

desavil
Użytkownik
Zarejestrowany: 2010-11-02

Re: [bash] Socket - wyświetlanie.

Jesteś WIELKI!
Dzięki bardzo! :]

Offline

 

#12  2011-09-10 11:12:34

  desavil - Użytkownik

desavil
Użytkownik
Zarejestrowany: 2010-11-02

Re: [bash] Socket - wyświetlanie.

Jeszcze jedno.

Wiesz może jak odczytać jeżeli użyję PHP:

Kod:

#!/usr/bin/php5
<?php
COS_CO_CZYTA
?>

Offline

 

#13  2011-09-10 14:30:38

  NIC - Członek DUG

NIC
Członek DUG
Skąd: Wrocław
Zarejestrowany: 2006-12-25
Serwis

Re: [bash] Socket - wyświetlanie.

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


Stronka-dom: [url]http://titek.victorygames.pl[/url]
Jabber: nic@jabster.pl
Hobby: kompilowanie Linuksa, Bluetooth
Dystrybucja: żadna, bliski krewny LFS, składak

Offline

 

#14  2011-09-10 15:38:49

  desavil - Użytkownik

desavil
Użytkownik
Zarejestrowany: 2010-11-02

Re: [bash] Socket - wyświetlanie.

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

 

#15  2011-09-10 17:38:03

  NIC - Członek DUG

NIC
Członek DUG
Skąd: Wrocław
Zarejestrowany: 2006-12-25
Serwis

Re: [bash] Socket - wyświetlanie.

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...


Stronka-dom: [url]http://titek.victorygames.pl[/url]
Jabber: nic@jabster.pl
Hobby: kompilowanie Linuksa, Bluetooth
Dystrybucja: żadna, bliski krewny LFS, składak

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.008 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00010 SET CHARSET latin2
0.00007 SET NAMES latin2
0.00109 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.142.210.173' WHERE u.id=1
0.00102 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.142.210.173', 1732459143)
0.00057 SELECT * FROM punbb_online WHERE logged<1732458843
0.00049 SELECT topic_id FROM punbb_posts WHERE id=180926
0.00005 SELECT id FROM punbb_posts WHERE topic_id=19671 ORDER BY posted
0.00059 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.00010 SELECT search_for, replace_with FROM punbb_censoring
0.00086 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.00071 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=19671
Total query time: 0.00565 s