Note : en suivant cette solution, tapez les commandes dans une seule session shell (ou utilisez un seul script) sauf indication contraire. Cela est dû à l'utilisation de variables et de descripteurs de fichiers, qui ne sont pas directement disponibles en dehors de leur session d'origine.
Créez un fifo temporaire. La bonne manière de créer un fichier temporaire est avec mktemp
. Malheureusement, il ne peut pas créer des fifos. Il peut cependant créer un répertoire temporaire :
tmpd=`mktemp -d`
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf" # juste pour connaître le chemin du fifo, cela peut être utile plus tard
Alternativement, vous pouvez créer un fifo nommé manuellement dans un emplacement fixe ou ad-hoc. C'est à vous de décider.
Créez un processus en arrière-plan qui lira le fifo et enverra des données à un serveur :
nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$! # Le PID peut être utile plus tard
Faites attention si nc
se termine prématurément. En supposant qu'il n'y ait pas de problème avec la connexion elle-même ni le serveur, la commande d'arrière-plan ci-dessus restera connectée jusqu'à ce que vous finissiez d'envoyer le premier tas de données via le fifo. Mais vous voulez qu'il reste ouvert et accepte plusieurs écritures, donc ouvrez le fifo et ne le fermez pas (encore) :
exec 3> "$tmpf"
Maintenant, vous pouvez envoyer ce que vous voulez à travers le fifo et la connexion de fond persiste :
echo abcd >&3 # envoie du texte
echo -e '\x80' >&3 # envoie du "binaire"
cat /etc/issue >&3 # envoie de fichier
cat >&3 # tapez ce que vous voulez, terminez avec Ctrl+D
N'importe laquelle de ces commandes peut être invoquée avec le chemin du fifo au lieu de &3
, si seulement vous connaissez le chemin. Sachant le chemin, vous pouvez écrire dans le fifo à partir de la même ou d'une autre session shell :
cat > /chemin/vers/le/fifo # tapez ce que vous voulez, terminez avec Ctrl+D
Ou vous pouvez ouvrir un descripteur dans une autre session de manière similaire comme dans la session originale. Peu importe la façon dont vous écrivez dans le fifo, le nc
le transmettra au serveur distant dans une seule connexion.
Mais attention aux conditions de concurrence. Utiliser un seul descripteur dans une seule session shell est une bonne manière de les éviter.
Après avoir transmis toutes les données nécessaires, terminez le nc
et fermez le descripteur dans la session shell d'origine :
kill $ncpid
exec 3>&-
Remarquez que dans certaines circonstances, la seule dernière commande suffit à faire sortir le nc
de fond ; cela dépend de ce que vous avez fait et de ce que vous faites encore avec le fifo. Pour cette raison, j'ai choisi de tuer le nc
explicitement.
Supprimez le répertoire temporaire et son contenu (c'est-à-dire le fifo) :
rm -r "$tmpd"
Note finale :
Il n'est pas nécessaire de mettre nc
en arrière-plan dès le début. Vous pouvez l'exécuter dans un terminal, écrire dans le fifo (en connaissant son chemin) depuis un autre. De cette manière, vous pouvez facilement surveiller son état. Adaptez cette solution à vos besoins.