Bonjour.
J'éprouve de grosses difficultés a modifier un script servant de serveur netcat très basique.

Le serveur (code à la suite) permet à un client de se connecter dessus et d'exécuter de manière distante des commandes diverses. C'est plus ou moins un shell distant très simple.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#! /bin/bash
 
# Ce script implémente un serveur.  
# Le script doit être invoqué avec l'argument :                                                              
# PORT   le port sur lequel le serveur attend ses clients  
 
if [ $# -ne 1 ]; then
    echo "usage: $(basename $0) PORT"
    exit -1
fi
 
PORT="$1"
 
# Déclaration du tube
 
FIFO="/tmp/$USER-fifo-$$"
 
# Il faut détruire le tube quand le serveur termine pour éviter de
# polluer /tmp.  On utilise pour cela une instruction trap pour être sur de
# nettoyer même si le serveur est interrompu par un signal.
 
function nettoyage() { rm -f "$FIFO"; }
trap nettoyage EXIT
 
# on crée le tube nommé
 
[ -e "FIFO" ] || mkfifo "$FIFO"
 
 
function accept-loop() {
    while true; do
	interaction < "$FIFO" | nc -v -l "$PORT" > "$FIFO"
    done
}
 
# La fonction interaction lit les commandes du client sur entrée standard 
# et envoie les réponses sur sa sortie standard. 
#
# 	CMD arg1 arg2 ... argn                   
#                     
# alors elle invoque la fonction :
#                                                                            
#         commande-CMD arg1 arg2 ... argn                                      
#                                                                              
# si elle existe; sinon elle envoie une réponse d'erreur.                     
 
function interaction() {
    local cmd args
    while true; do
	read cmd args || exit -1
	fun="commande-$cmd"
	if [ "$(type -t $fun)" = "function" ]; then
	    $fun $args
	else
	    commande-non-comprise $fun $args
	fi
    done
}
 
# Les fonctions implémentant les différentes commandes du serveur
 
 
function commande-non-comprise () {
   echo "Le serveur ne peut pas interpréter cette commande"
}
 
function commande-shutdown() {
       shutdown -t 10
}
 
# Le "touch" me sert a avoir une trace coté serveur de la bonne réception d'une commande. Il ne sert a rien d'autre.
function commande-reponse() {
       echo "reponse du serveur"
       touch yahoo
}
 
function commande-convert() {
       echo $1 | tr '[:lower:]' '[:upper:]'
}
 
# On accepte et traite les connexions
 
accept-loop
L'utilisation standard de ce serveur est la suivante :

Il suffit de donner en argument le port sur lequel le serveur netcat doit écouter et attendre une connexion.

Un client (en local pour l'exemple) peut ensuite venir se connecter en faisant:
Mon objectif et mon plus gros problème est le suivant :
Une fois connecté il suffit alors de tapper la commande puis d'appuyer sur entrée pour que le serveur la traite. Seulement j'aimerais pouvoir envoyer une commande à ce serveur sans pour autant la taper manuellement coté client.

Pour ce faire j'ai essayé les méthodes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
echo -n "commande\r" | nc localhost 8080
Code : Sélectionner tout - Visualiser dans une fenêtre à part
nc localhost 8080 < testducat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
cat testducat | nc localhost 8080
Avec un fichier texte "testducat" contenant la commande a envoyer.


Mais le serveur ne réagit absolument pas. Pourtant ce type de commande devrait imiter à la perfection une entrée au clavier non ?
De plus elle ressemble fortement à la commande d'exemple proposée dans le man de netcat...

Je suppose que le/la FIFO présente coté serveur empèche la réception de la chaîne de caractère envoyé par echo.

Étonnamment la seul fois où j'ai réussi à faire parvenir une commande sans la taper c'est de la manière suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
yes "reponse" | nc localhost 8080
Cette commande sature de "reponse" le serveur et celui-ci répond. Mais ce n'est évidemment pas très pratique étant donné que la commande coté serveur est exécutée une infinité de fois...

Sincèrement j'ai passé plusieurs heures cette après midi pour trouver une solution. Je vous prie de croire que ce n'est pas par fainéantise que je me permets d'appeler à l'aide :p Mais bien parce que je ne comprends pas où est le problème


En tout les cas, merci de votre aide