Que fait «w» avec urandom?

8
> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep\0urandom\0", 2047) = 22
> 

Pourquoi "w" a-t-il besoin d'urandom? Comment éviter cela?

MISE À JOUR:

> strace w 2>&1 | awk '/urandom/'
read(4, "awk\0/urandom/\0", 2047)       = 14
> 

c'est donc le filtrage qui a quelque chose à voir avec urandom?

> strace who 2>&1 | grep urandom
> 

Alors pourquoi "qui" n'est-il pas affecté?

Marina Ala
la source
1
Ce n'est pas wce qui a besoin urandom. C'est parce que Piped commands run concurrently: unix.stackexchange.com/questions/37508/…
Arkadiusz Drabczyk
@ArkadiuszDrabczyk est logique. Il n'y a pas d' urandomaccès dans w le code source.
Rui F Ribeiro
2
Vous voyez la deuxième commande dans le pipeline, votre grepet votre awk. Il n'ouvre pas wle /dev/urandomfichier de l' appareil. C'est similaire àps -aux | grep grep
Kusalananda
1
@RuiFRibeiro: correct, je l'ai également vérifié pour m'assurer. Je pense que cette question pourrait maintenant être marquée comme un double.
Arkadiusz Drabczyk
1
Vous pouvez poser la question sur les licornes: strace w 2>&1 | grep unicorns;-)
Digital Trauma

Réponses:

8

Comme expliqué dans d'autres réponses et commentaires, la raison de ce que vous observez est la façon dont Bashles tuyaux sont traités. Afin de filtrer ce que vous voulez vraiment dans des situations similaires, vous pouvez essayer d'inclure la première lettre de l' grepargument []comme ceci:

$ strace w 2>&1 | grep random
read(4, "grep\0random\0", 2047)         = 12
$ strace w 2>&1 | grep '[r]andom'
$ strace w 2>&1 | grep '[c]lose'
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
(...)

ÉDITER:

Comme l'a correctement noté R. dans le commentaire ci-dessous, en fait, stracene voit pas l'autre côté du tuyau. De la même manière, ps aux | grep grep qui s'affiche également grep grepdans sa sortie, wparcourt le /procrépertoire et y trouve un grepprocessus.

Arkadiusz Drabczyk
la source
2
Heureux de voir quelqu'un d'autre faire cela (bien que je place généralement la dernière lettre entre crochets) avec ps / strace etc. Le moyen le plus simple de l'empêcher de trouver sa propre ligne de commande.
Monty Harder
Cette astuce semble devenir largement connue. J'ai entendu dire qu'il est répertorié dans certaines FAQ, et il est mentionné à plusieurs reprises ici sur Stack Exchange .
Scott
1
Cette réponse, et les commentaires sur la question elle-même qui disent à peu près la même chose, sont tout simplement faux. L'autre réponse (par ilkkachu) est juste. stracene trace pas (et ne peut pas, de manière simple) les autres commandes du pipeline shell. Au lieu de cela, wrecherche les commandes en cours d'exécution sur votre terminal (et d'autres terminaux) et parcourt le grep dans le cadre de son travail.
R .. GitHub STOP STOPINGING ICE
Correct, merci, j'ai mis à jour ma réponse.
Arkadiusz Drabczyk
15

Depuis la page de manuelw(1) :

w affiche des informations sur les utilisateurs actuellement sur la machine et leurs processus

Pour afficher les processus des utilisateurs, il passe par tous les processus en cours d'exécution sur la machine. Essayons ça:

$ strace -o w.trace w | grep whatever

À l'intérieur de la trace, nous trouvons des lignes comme celles-ci (sur un système Linux):

open("/proc/8286/cmdline", O_RDONLY)    = 4
read(4, "grep\0whatever\0", 2047)       = 14

Ce qui montre wexplicitement passer en revue /procet regarder les lignes de commande de tous les processus (et d'autres choses, non illustrées). Il trouve le grepqui lui est parallèle et c'est ce stracequ'il voit faire. Le tuyau n'a rien à voir avec cela, à part démarrer les deux processus en même temps. D'une certaine manière, cela revient à ps | grepvoir le grep lui-même.

who et la plupart des autres commandes n'ont pas besoin des informations sur les processus, et ne vont pas chercher, donc vous ne voyez pas la même chose lors de leur traçage.

ilkkachu
la source