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
nc
– ne 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.