3 votes

Traitement de l'entrée de script canalisée vers netcat

J'ai un système qui traite les e-mails entrants pour les envoyer à une application boîte noire à mon travail. Le script de haut niveau est maintenu par inittab pour toujours s'exécuter et exécute un script enfant pour faire le travail réel avec cette commande :

$SCRIPT | nc -l -p $PORT

Le script lui-même lit à partir d'un tuyau nommé, effectue un peu d'analyse et de traitement des données avant de faire appel à echo pour renvoyer les données via netcat au processus connecté sur $PORT.

Ce dont j'ai besoin, c'est d'une méthode pour gérer les données entrantes à l'extrémité de mon tuyau. Lorsque je fais une demande dans l'application pour fermer la connexion, elle renvoie une chaîne (je peux la définir comme je veux) et attend que mon script ferme le tuyau. J'ai actuellement du mal à comprendre comment je peux ajouter la fonctionnalité pour lire les données entrantes de l'autre extrémité ; vérifier qu'il s'agit de la commande de fermeture du tuyau, puis quitter le script.

Mon script (en résumé) ressemble à ceci :

while true ; do
  email_input="`cat "$pipe"`"
  if [[ $email_input =~ .*escape_queue.* ]] ; then
    break;
  fi
  echo "`parse`"
done

Je suis ouvert à la possibilité de devoir modifier le déroulement du programme, mais je n'arrive pas à comprendre comment je pourrais lire les données entrantes de manière asynchrone puisque le script se bloque sur cat $pipe jusqu'à ce qu'un nouvel e-mail soit reçu pour être traité.

Si ce n'est pas clair, je suis novice en matière de scripting bash et je suis toujours ouvert aux suggestions d'amélioration.

UPDATE J'ai changé mon appel script en

$SCRIPT | nc -l -p $PORT > $nc_data

et dans le script lui-même

netcat_response="`cat "$nc_data"`";
if [[ "$netcat_response" =~ "exit" ]] ; then
  cat /dev/null > $nc_data
  break;
fi

À ce stade, le script se termine dès qu'un nouveau message est acheminé dans le fifo. Cela signifie que je vais toujours perdre 1 message car il est lu par le script et ensuite le script se termine. Le script bloque toujours sur le fichier cat jusqu'à ce que quelque chose soit lu. Dans le pire des cas, il faudra s'en contenter.

3voto

staticsafe Points 46

Vous pouvez demander à nc de quitter après un certain temps à partir du EOF de stdin.

$SCRIPT | nc -l -q 5 -p $PORT > $nc_data

-q soit l'option de quitter après un certain nombre de secondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X