Comment connecter stdin à une liste de commandes (avec pipes) à l’une de ces commandes

Je dois donner à l’utilisateur la possibilité d’envoyer / recevoir des messages sur le réseau (en utilisant netcat ) pendant que la connexion est établie (l’utilisateur, dans ce cas, utilise nc tant que client ). Le problème est que je dois envoyer une ligne avant que l’ utilisateur ne commence à interagir. Ma première tentative était:

 echo 'my first line' | nc server port 

Le problème avec cette approche est que nc ferme la connexion lorsque echo termine son exécution, donc l’utilisateur ne peut pas envoyer de commandes via stdin car le shell lui est rendu (et la réponse du serveur n’est pas reçue car cela retarde quelques secondes pour commencer à répondre et, comme nc ferme la connexion, la réponse n’est jamais reçue par l’utilisateur).

J’ai aussi essayé de grouper les commandes:

 { echo 'my first line'; cat -; } | nc server port 

Cela fonctionne presque comme je le souhaite, mais si le serveur ferme la connexion, il faudra attendre que j’appuie sur pour me redonner le shell. Je dois récupérer le shell lorsque le serveur ferme la connexion (dans ce cas, le client – ma commande ncne ferme jamais la connexion, sauf si j’appuie sur Ctrl + C).

J’ai aussi essayé des pipes nommés, sans succès.

Avez-vous des conseils sur la façon de le faire?

Note: J’utilise openbsd-netcat.

Vous voulez probablement regarder dans expect(1) .

C’est le cat qui attend l’entrée. Vous pouvez écrire un script après nc pour tuer le cat et il retournera automatiquement au shell.

Vous pouvez essayer ceci pour voir si cela fonctionne pour vous.

 perl -e "\$|=1;print \"my first line\\n\" ; while () {print;}" | nc server port 

Celui-ci devrait produire le comportement que vous voulez:

 echo "Here is your MOTD." | nc server port ; nc server port 

Je vous suggère d’utiliser le cat << EOF , mais je pense que cela ne fonctionnera pas comme prévu.

Je ne sais pas comment vous pouvez envoyer EOF lorsque la connexion est fermée.