echo command | netcat Host port
La commande est alors envoyée à l'hôte distant et certaines données sont relues. Mais après quelques secondes, la connexion se ferme. Le paramètre -w n'a rien changé. J'utilise netcat v1.10 sur SuSE 10.1.
Cela fonctionne avec la commande nc
sous OS X (en supposant que la commande que vous voulez envoyer se trouve dans un fichier):
cat file - | nc Host port
(Essentiellement, cat
vide le contenu du fichier sur stdout puis vous attend sous stdin).
Par extension, si vous souhaitez envoyer la commande à partir du shell, procédez comme suit:
cat <(echo command) - | nc Host port
Avec nc
sur Ubuntu:
nc -q -1 Host port
Depuis la page de manuel de Ubuntu nc
:
-q seconds
after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
Notez que les options nc
disponibles varient beaucoup d’une distribution à l’autre, il est donc possible que cela ne fonctionne pas sur la vôtre (OpenSUSE).
Je l'ai trouvé:
echo command | netcat Host port -
Mon collègue le savait. Je ne le vois pas du tout dans la documentation.
Je ne pense pas que vous allez gérer cela avec netcat ou socat. Je viens de faire un bricolage intensif avec les deux, et Socat semblait le plus prometteur.
J'ai réussi à configurer socat pour qu'il se connecte au port distant TCP et écoute sur un socket de domaine unix local (en théorie, afin que le lien puisse être maintenu tout le temps), mais dès que le processus local se détache le socket Unix (un autre socat reliant le socket Unix à stdin/out), il a fermé la session TCP socat.
Le problème ici est que chaque connexion via netcat/socat établit une nouvelle connexion de flux TCP vers le serveur et ferme cette session de flux TCP lorsque la fin locale se déconnecte.
Je pense que vous allez probablement devoir écrire un logiciel proxy personnalisé pour cela qui ouvre la connexion TCP à l'extrémité distante et écoute ensuite localement sur un socket/tube/fifo ou quoi que ce soit et envoie ensuite le données vers le canal existant TCP et renvoie les résultats.
La connexion est-elle fermée à l’autre extrémité de la prise?
Par défaut, nc
ferme la connexion une fois l'opération terminée, si vous ne lui dites pas explicitement de rester à l'écoute (avec l'option -k
):
-k Forces nc to stay listening for another connection after its current
connection is completed. It is an error to use this option without the
-l option.
Voir man nc.1
.
Je réussis à diffuser des données entre deux machines comme ceci:
expéditeur:
while (true); do
echo -n "$RANDOM " | nc <Host> <port>
done
receveur:
nc -kl <port>
La méthode de Georges fonctionne bien à partir d'un shell interactif, mais ne vous aidera pas avec les scripts, par exemple. appelant votre script en tant que Nohup ./script &
.
J'ai trouvé que remplacer stdin par un fifo aide.
mkfifo dummy
cat command.txt dummy | nc Host port
Puisque rien n’écrit jamais dans le fifo, après la sortie du fichier, cat
s’accroche indéfiniment.
socat
's shut-none
devrait aider ici:
Changes the (address dependent) method of shutting down the write part of a connection to not do anything.
Vous devrez probablement également remplacer le délai d'attente par défaut à l'aide de -t <timeout>
, sinon le socket sera fermé après 0,5 seconde. Cette option annule le comportement par défaut, à savoir:
When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.
Donc, une commande telle que:
echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none
gardera la prise ouverte pendant 10 secondes après l'envoi du message "blah".
Votre commande se termine si l'hôte distant ferme la connexion (ou n'est pas accessible) ou si la commande avant la fin du canal de communication est terminée (alors que netcat envoie toujours le reste de sa file d'attente d'entrée).