Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pipe non bufférisé

3 réponses
Avatar
Vincent Bernat
Coucou !

Lorsque je veux sniffer sur une machine distante sans avoir à rapatrier
un fichier pcap pour regarder avec wireshark, j'utilise directement une
commande de ce genre :

ssh remotehost sudo tcpdump -s0 -ni veth0 -w - | wireshark -k -i -

Le petit problème, c'est que le pipe bufferise (ou le tcpdump car il
détecte qu'il ne s'agit pas d'un terminal qu'il a en face). Du coup,
s'il n'y a pas beaucoup de trafic, l'affichage peut avoir pas mal de
retard. Rajouter un -t à ssh ne change rien (ça fait la même chose en
local de toute façon).

Je me souviens avoir fait il y a quelques années un wrapper autour de
tail pour pouvoir colorier en temps réel les logs. Il fallait placer un
ioctl particulier pour indiquer à la libc de ne pas bufferiser la
sortie. Je ne me souviens plus des détails.

Toujours est-il que je me demande s'il n'y a pas un moyen plus simple :
- zsh est-il capable de faire un pipe qui ferait croire au programme à
gauche de celui-ci qu'il a affaire à un terminal (zpty ?)
- existe-t'il un wrapper générique qui transforme un programme qui
bufferise en un programme qui ne bufferise pas en sortie ?

Merci.
--
printk("VFS: Busy inodes after unmount. "
"Self-destruct in 5 seconds. Have a nice day...\n");
2.3.99-pre8 /usr/src/linux/fs/super.c

3 réponses

Avatar
Nicolas George
Vincent Bernat wrote in message :
Le petit problème, c'est que le pipe bufferise



Non. Un pipe a un buffer, qui permet au côté qui écrit d'écrire un petit peu
sans être bloqué même si le côté qui lit est en train de faire autre chose.
Mais ce buffer ne retarde jamais l'arrivée des données.

(ou le tcpdump car il
détecte qu'il ne s'agit pas d'un terminal qu'il a en face)



Oui, c'est tcpdump le coupable. Ou plus exactement la libc chargée par
tcpdump.

- zsh est-il capable de faire un pipe qui ferait croire au programme à
gauche de celui-ci qu'il a affaire à un terminal (zpty ?)



Non. On pourrait allouer un pseudo-terminal, mais d'une part, un
pseudo-terminal, c'est vraiment une mauvaise idée pour des données binaires,
et d'autre part ça bufferise quand même, par ligne et plus par blocs, mais
pour des données binaires, ça n'améliore pas grand chose.

- existe-t'il un wrapper générique qui transforme un programme qui
bufferise en un programme qui ne bufferise pas en sortie ?



Rien de générique, puisque tout se passe à l'intérieur du programme, sans
aucun appel système. Le mieux que tu puisse espérer, c'est un LD_PRELOAD qui
surcharge des fonctions de la libc.

En revanche, tu devrais chercher -U dans la doc de tcpdump.
Avatar
naddy
Vincent Bernat wrote:

ssh remotehost sudo tcpdump -s0 -ni veth0 -w - | wireshark -k -i -

Le petit problème, c'est que le pipe bufferise (ou le tcpdump car il
détecte qu'il ne s'agit pas d'un terminal qu'il a en face).



tcpdump -l

Je me souviens avoir fait il y a quelques années un wrapper autour de
tail pour pouvoir colorier en temps réel les logs. Il fallait placer un
ioctl particulier pour indiquer à la libc de ne pas bufferiser la
sortie. Je ne me souviens plus des détails.



Ce n'est pas un ioctl(2), c'est setvbuf(3).

- existe-t'il un wrapper générique qui transforme un programme qui
bufferise en un programme qui ne bufferise pas en sortie ?



Non. C'est le programme lui-même qui bufferise, donc ni d'autres
programmes ni le noyau ne peuvent changer ce comportement.

--
Christian "naddy" Weisgerber
Avatar
Vincent Bernat
OoO En ce début de soirée du samedi 19 juillet 2008, vers 21:15, Nicolas
George <nicolas$ disait :

En revanche, tu devrais chercher -U dans la doc de tcpdump.



Ah, bien vu ! Merci.
--
MY MOM IS NOT DATING JERRY SEINFELD
MY MOM IS NOT DATING JERRY SEINFELD
MY MOM IS NOT DATING JERRY SEINFELD
-+- Bart Simpson on chalkboard in episode AABF06