Newsgroup: it.comp.os.linux.sys
Titolo: Semplice script client/server...

Ciao a tutti!
Pensavo di usare netcat per un semplice script lato server che
dovrebbe piu' o meno comportarsi in questa maniera:
- Mi metto in ascolto su una porta TCP (supponiamo la 11233)
- Aspetto di ricevere un comando (per esempio 'chieconnesso')
- Rispondo al client ad esempio con l' output di 'who'
Ho letto le man pages di nc ma non trovo una risposta, l' unico modo
con cui ottengo qualcosa e' questo:
while : ; do
 who | nc -4 -l -p 11233
done
..aldilà di non gestire le richieste del client non offre mai al
client l' output di 'who' aggiornato al momento della connessione e
quindi non è la soluzione...
Come faccio a gestire Domanda&Risposta su un socket gestito da netcat?


Facebook: Massimo Bacilieri


Imho in questi casi, forse, è meglio un Python o Perl. Più immediati del 
C per quello che si deve fare (con il c devi gestirti tutto tu, con 
Python e Perl è veramente molto poco), e non critici come prestazioni.
Ad esempio in python:
---8<--- CUT HERE ----
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import SocketServer
import commands
class Handler(SocketServer.BaseRequestHandler):
     def handle(self):
         try:
             self.request.sendall(commands.getoutput('who'))
         except Exception,e:
             self.request.sendall(unicode(e))
         self.request.close()
srv = SocketServer.ThreadingTCPServer(('',11223),Handler)
srv.serve_forever()
---8<--- CUT HERE ----
Luca

 Python e Perl è veramente molto poco), e non critici come prestazioni.
Quindi con solo netcat e comandi bash non è realizzabile?
Vedro' di rispolverare un po' Perl su cui avevo giochicchiato
parecchio tempo fa...

 - Rispondo al client ad esempio con l' output di 'who'
uhm ... gestione socket a parte, ma mi sbaglio o tu stai cercando di
reinventare la ruota?
man finger
che poi può essere implementato in diversi modi, vedi: 
finger @
www.kernel.org
-- 
Wikipedia Admin: "wikipedia non è un blog"
Iosif Stalin: "i compagni hanno scambiato il partito per un circolo di
discussione"


Netcat per Windows ha l'opzione -e che permette di dire a nc di invocare 
un comando alla connessione e di connettere stdin e stdout a quel 
programma (ad esempio prova
C:\> nc -L -p 11223 -e cmd.exe
), come pure l'opzione -L (listen harder)
Nella versione Linux non ho visto traccia di queste opzioni.
La mia versione in Python è scritta di getto e decisamente rozza.
Probabilmente in Perl si fa con 3 righe di numero. Sempre invocando il 
comando who sulla connessione del client.
Generalmente (almeno a quanto mi risulta) sia python che perl sono già 
disponibili su tutti i sistemi Linux.
Bash permette di fare tanto, ma in questo caso non mi sembra 
propriamente lo strumento adatto.
Luca

 propriamente lo strumento adatto.
Scusate, ma cos'hanno inetd e xinetd che non vanno?
La gestione della comunicazione TCP/IP la fanno tutta loro e basta usare
STDIN e STDOUT come Input e Output.
Ciao
Luca Bertoncello
(
luca...@lucabert.de
)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Per intenderci:
# finger @localhost
[localhost]
Login     Name                 Tty      Idle  Login Time   Office
Office Phone maxadamo  Massimiliano Adamo   tty7    16:30  Sep 19 13:46
(:0) maxadamo  Massimiliano Adamo   pts/11   6:15  Sep 19 13:47 (:0.0)
maxadamo  Massimiliano Adamo   pts/13   6:15  Sep 19 13:49 (:0.0)
maxadamo  Massimiliano Adamo   pts/12         Sep 19 13:56 (:0.0)
Mi dice chi è connesso e su quale tty. Era questo quel che ti serviva?
Altrimenti c'è un demone più configurabile che si chiama cfingerd,
altrimenti, ha ragione Luca: xinetd/inetd is your friend.


 STDIN e STDOUT come Input e Output.
Doh! Sai che non ci avevo mai pensato?! :-O


 STDIN e STDOUT come Input e Output.
qualche esempio giusto per avere uno spunto da cui partire?

 qualche esempio giusto per avere uno spunto da cui partire?
http://bit.ly/98ggrS
in poche parole: una ca$$ata unica.
E effettivamente nemmeno io ci avevo pensato.



Prova
nc -l -p 11233 -e /bin/bash who
e sappimi dire

Il 19/09/2010 10.02, Alessandro ha scritto:

Prova


 nc -l -p 11233 -e /bin/bash who
dalle manpages di 'nc' il flag -e non esiste... googlando ho visto che
c'è per windows, ma per qualche ragione (credo di sicurezza) su *nix
non è stato portato...

 non č stato portato...
nc -l -p 11233 -c /sbin/who
o /bin/who, non mi ricordo dov'č.

 o /bin/who, non mi ricordo dov'è.
nc: invalid option -- 'c'
http://it.wikipedia.org/wiki/Netcat
# -c shell commands come -e configura un comando /bin/sh da eseguire
alla connessione
# -e filename configura un programma da eseguire alla connessione
...ma a quanto pare windows only...


Bho, ora ho da fare e non sono in ufficio dove o i nodi linux. Tra oggi 
o domani ci guardo.

output di un qualsiasi script eseguito lato server...
Premesso che 'unciňccapitognente, ma io ci provo uguale, ché.
Fai uno script tipo questo
#!/bin/sh
while (true); do
        read CMD
        # chomp
        CMD=$( echo "$CMD" | tr -d "\r\n" )
        echo You said "$CMD".
        case "$CMD" in
                "who"|"ps"|"uptime")
                        $CMD
                ;;
                "exit")
                        exit
                ;;
        esac
done
e lo metti in ascolto sul server usando xinetd. In questo caso ho messo
doom, la porta 666/tcp.
service doom
{
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = caiordo
        server          = /usr/local/bin/doom
        flags           = IPv4
}
Leonardo
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

 Premesso che 'unciòccapitognente, ma io ci provo uguale, ché.

Fantastico, quello che cercavo!

Fantastico, quello che cercavo!
Si dice «Ecco! E' l'informazione che volevo. Grazie» :-D
Leonardo 'sparecchiavo...'


 nc: invalid option -- 'c'
[Terminale 1]
enrico@whiterabbit:~$ nc -l -p 11233 -c /usr/bin/who
[Terminale 2]
enrico@whiterabbit:~$ telnet localhost 11233
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
enrico   pts/0        2010-09-20 20:13 (:0)
enrico   pts/1        2010-09-20 20:13 (:0.0)
enrico   pts/2        2010-09-20 20:24 (:0.0)
enrico   pts/3        2010-09-20 20:28 (:0.0)
Connection closed by foreign host.
enrico@whiterabbit:~$
[Terminale 1]
enrico@whiterabbit:~$ nc -l -p 11233 -e /usr/bin/id
[Terminale 2]
enrico@whiterabbit:~$ telnet localhost 11233
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
uid=1000(enrico) gid=1000(enrico) 
groups=1000(enrico),20(dialout),24(cdrom),25(floppy),29(audio),44(video),46(plugdev),114(firebird)
Connection closed by foreign host.
enrico@whiterabbit:~$
enrico@whiterabbit:~$ dpkg -l|grep netcat
ii  netcat-traditional   1.10-38    TCP/IP swiss army knife
enrico@whiterabbit:~$
Enrico
P.S. Debian Sid


Ah ecco...

 Si dice «Ecco! E' l'informazione che volevo. Grazie» :-D
:-D

 > enrico@whiterabbit:~$ dpkg -l|grep netcat

Se in vena di risparmiare bit, eh ;-) Così però non si capisce più
niente.
Rispondo a Leonardo Serni per quel che ha scritto lui, e rispondi agli
altri per quel che hanno scritto gli altri ;-)


 ha scritto:

i bit costano:-)

 Ah ecco...
Ma no, dai, potevi aggiungere un po' di righe a brullo solo per aumentare 
l'entropia della risposta...
Un Enrico che consola la netiquette appena violentata...
P.S. seriamente parlando, con Debian direi che oramai e` normale trovarsi 
delle situazioni del genere. Giusto per fare un esempio, per provare 'sta 
cosa mi sono ritrovato a dover scegliere il pacchetto telnet da installare 
in quanto nei repository ce ne sono tre, e tutti e tre differenti l'uno 
dall'altro