J'essaie d'envoyer des commandes à un port TCP à l'aide de la netcat
réponse et du canal
lorsque j'exécute netcat
et tape ma commande, elle affiche la réponse correctement, mais lorsque je passe la commande à partir d'un canal, elle envoie la commande correctement mais n'imprime pas la réponse
Donc, cela fonctionne correctement:
netcat localhost 9009
alors que cela envoie simplement une commande mais n'imprime pas de réponse:
echo 'my_command' | netcat localhost 9009
Pourquoi?
Comment faire netcat
pour imprimer un texte de réponse?
OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
version; et à l'extrémité distante esttelegram-cli
sur la même machine.netcat
reçu l'EOF sur STDIN, qu'il arrête immédiatement les deux côtés de la prise au lieu de faire un demi-fermeture et d'attendre que le côté distant ferme son extrémité. Sisocat
c'est une option, je le recommande fortement à la place. Il n'y en a qu'unsocat
, donc vous n'avez pas de problèmes de portabilité avec une douzaine de versions différentes, il se comporte beaucoup plus sainement et est hautement configurable.Réponses:
Comme l'a dit @Patrick, ce problème est généralement dû à la
netcat
fermeture avant la réponse. Vous remédiez à cela en ajoutant-q 2
à la ligne de commande, c'est-netcat
à- dire, dites de suspendre environ 2 secondes après avoir détecté EOF sur l'entrée standard. De toute évidence, vous pouvez également faire attendre un autre nombre de secondes.la source
-q 2
a fonctionné mais est-il fiable? il fait une requête web Je ne peux pas être sûr que 2s soit toujours suffisant! puis-je ?-w
possibilité de jouer avec. Tout cela estman nc
bien sûr dans la page.invalid option -- 'q'
nc
quitte-t-il immédiatement au lieu d'attendre une réponse? Si la connexion est toujours ouverte, il devrait y avoir une option pour fairenc
attendre qu'elle se ferme, pas seulement pour la fin de stdinUtilisez ceci:
Le problème est que
nc
la connexion se fermera immédiatement après la fermeture de stdin, ce qui est très rapide pour une simplemy_command
chaîne et n'a donc jamais la chance de recevoir une réponse. (Si vous dirigez un fichier très volumineux, vous verrez qu'il pourrait obtenir une réponse avant l'envoi du fichier).Entrez
cat
avec-
comme deuxième argument: il faitcat
écouter sur stdin pour plus de contenu à acheminer après avoir envoyé le contenu du premier argument. Le premier argument consiste simplement à passer laecho
commandecat
- il peut également s'agir d'un fichier avec vos commandes à la lacat < file - | ...
.Sinon, procédez comme suit:
Cela envoie un nombre illimité de
#
caractères sur la 2ème ligne de l'entrée. Utiliser des#
travaux pour un bash comme remote qui ignorerait cela en tant que commentaire. J'ai choisi un petit temps d'attente de 10 millisecondes ici, donc il réagit plus rapidement à la fin de la connexion. YMMV.L'inconvénient de cela peut être cela
cat
ou lawhile
boucle etnc
continuer à fonctionner jusqu'à ce que vous frappiez^C
ou^D
sur la coque. Cela dépend vraiment de l'extrémité distante.L'ajout d'un délai d'expiration à l'aide de
-w 1
(OSX netcat) ou-i 1
(ncat de nmap) le fait fermer la connexion etnc
après 1 seconde, maiscat
continuera de fonctionner jusqu'à ce que vous saisissiez un caractère et que le tuyau se brise (je pense).Cependant, cela fonctionne si le côté distant ferme automatiquement la connexion après avoir reçu et traité la commande - cela mettra également fin au
nc
client et au processus.Cette réponse est basée sur cette cette réponse à une question de superutilisateur identique .
la source
{ echo my_command; cat;}
ferait de même et pourrait être considéré comme plus facile à comprendre.Différentes versions openbsd-netcat sont originales, nécessitant différentes combinaisons de
-w <seconds>
,-q <seconds>
,-N
et même besoin de différents arguments en fonction de ce qui est en cours d' exécution à l'autre bout de la connexion. L'utilisation d'options de délai d'attente avec certaines versions ou certains serveurs entraîne des retards, et leur non-utilisation peut entraîner un retard extrêmement long (infini?). Et je m'attendrais à des bizarreries différentes avec gnu netcat, mais je ne sais pas si elles sont différentes entre les versions.Par exemple, la version 1.130_3 d'Archlinux prend extrêmement longtemps (pour toujours?) Quand je fais ceci:
Mais cela fonctionne avec -N ajouté au serveur ou au client.
la source
Je sais que c'est un peu vieux mais aucune autre réponse n'a fonctionné pour moi et cela a fonctionné:
Remarquez
-N
:A travaillé pour moi sur Windows et Linux.
Remarque: Il s'agit d'un copier-coller de la réponse que j'ai publiée pour une question en double .
Je pense que cela pourrait être utile. Les mods se sentent libres de modifier / supprimer si cela est contraire à la politique ou à quelque chose.
la source