[Tutorial] Creazione di Servizi

Forum dedicato agli studenti del corso linux e a tutti gli amanti del pinguino!

Moderatore: matteo

[Tutorial] Creazione di Servizi

Messaggioda matteo » mer mag 10, 2006 12:36 am

Perchè limitarci ad utilizzare, sulla nostra macchina, solamente servizi scritti da altre persone, che siano open o closed source, magari ammattendoci per cercare quello più consono al nostro caso.
Magari vogliamo semplicemente usare un prodotto che faccia esattamente lo stesso che fa il nostro classico script agendina.sh:
Codice: Seleziona tutto
#!/bin/bash
echo -n "Inserisci il nome da cercare: "
read NOME
grep -i $NOME /tmp/fileagenda
[ $? -ne 0 ] && echo "Nessuna voce trovata!!"

che a noi piace tanto quando lo utilizziamo in locale (mi raccomando il chmod +x agendina.sh).
Supponendo che vogliamo consultare l'agenda da remoto, sono sicuro che in rete si trovano solo software supermegagalattici.
Io credo che se abbiamo fatto un bello scriptino (magari un po' migliore di quello che ho scritto io) sarebbe carino poterlo utilizzare da remoto, magari richiamandolo in tcp.

Tempo fa avevo lasciato perdere l'idea di farmi un daemon che stesse in ascolto su una porta perchè pensavo che non si potesse fare (o almeno non semplicemente) con linguaggi interpretati (lo scripting per capirsi) ma solamente con i programmi compilati (quindi il C) dovendo utilizzare le librerie per i socket ecc.

Recentemente, per necessità, ho ripreso l'idea e mi è venuto in mente l'inetd, che è nato per questo.
Prendendo spunto tra le righe presenti in /etc/inetd.conf ho inserito un bel
1234 stream tcp nowait mrossini /usr/sbin/tcpd /tmp/agendina.sh
(mi raccomando un kill -HUP <pid di inetd>)
Ogni volta che una macchina si connetterà su questo server sulla porta 1234 tcp, verrà lanciato lo script /tmp/agendina.sh (a cui non abbiamo modificano neppure una riga), come untente mrossini, e lo standard input/output/error, saranno reindirizzati sul client che ha aperto la connessione.
Il client più semplice è "telnet", che però riporta qualche difetto. Quando si preme enter, invia sia il CarriageReturn sia il NewLine. Purtroppo il comando read di bash sa che enter equivale a NewLine e basta (la stessa storia del comando ASC/BIN in ftp)
La soluzione è inserire sotto la read, anche:
NOME="`echo $NOME|recode ibmpc..lat1`" oppure
NOME="`echo $NOME|sed s/^M$//`", in cui il ^M è ottenuto premendo CTRL+V seguito da CTRL+M, oppure ancora più semplicemente
NOME="`echo $NOME|sed s/.$//`" (quest'ultimo è il più semplice, ma è sconsigliato)

ecco l'esito del test:
Codice: Seleziona tutto
$ telnet 192.168.0.30 1234
Trying 192.168.0.30...
Connected to 192.168.0.30.
Escape character is '^]'.
Inserisci il nome da cercare: matteo
Matteo  1111
Connection closed by foreign host.


Se poi volete potete far interagire un servizio scritto in tal modo con un nostro demone fatto con http://www.frattocchie.it/forum/viewtopic.php?t=77 allora bisogna studiarsi le trap, ma prima mi studierei come si costruisce un client personalizzato che mi sostituisca telnet.

Buon divertimento,
Matteo
matteo
 
Messaggi: 327
Iscritto il: ven mar 17, 2006 10:22 am

Torna a Unix, Linux & reti

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron