Cosa fa "w" con urandom?


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

Perché "w" ha bisogno di urandom? Come evitarlo?

AGGIORNARE:

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

quindi è il filtro che ha a che fare con urandom?

> strace who 2>&1 | grep urandom
> 

Allora perché "chi" non è interessato?


1
Non è ciò di wcui ha bisogno urandom. È perchéPiped commands run concurrently : unix.stackexchange.com/questions/37508/…
Arkadiusz Drabczyk

@ArkadiuszDrabczyk Ha senso. Non c'è urandomaccesso nel w codice sorgente.
Rui F Ribeiro,

2
Stai vedendo il secondo comando nella pipeline, tuo grepe tuo awk. Non sta waprendo il /dev/urandomfile del dispositivo. È simile aps -aux | grep grep
Kusalananda

1
@RuiFRibeiro: corretto, l'ho controllato anche per esserne sicuro. Penso che questa domanda potrebbe ora essere contrassegnata come duplicata.
Arkadiusz Drabczyk,

1
Puoi porre la domanda sugli unicorni: strace w 2>&1 | grep unicorns;-)
Digital Trauma

Risposte:


8

Come spiegato in altre risposte e commenti, il motivo di ciò che si osserva è il modo in cui Bashgestisce i tubi. Per filtrare ciò che vuoi veramente in situazioni simili puoi provare a racchiudere la prima lettera grepdell'argomento in []questo modo:

$ 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
(...)

MODIFICARE:

Come osservato correttamente da R. nel commento sotto, infatti, stracenon si vede l'altro lato del tubo. Analogamente a ciò ps aux | grep grep che mostra anche grep grepnel suo output wè camminare attraverso la /procdirectory e trovare il grepprocesso lì.


2
Felice di vedere qualcun altro che lo fa (anche se di solito invece racchiudo l'ultima lettera) con ps / strace ecc. Il modo più semplice per impedirgli di trovare la propria riga di comando.
Monty Harder,

Questo trucco sembra essere diventato ampiamente noto. Ho sentito che è elencato in alcune domande frequenti ed è menzionato molte volte qui su Stack Exchange .
Scott,

1
Questa risposta, e i commenti sulla stessa domanda che dicono più o meno la stessa cosa, sono semplicemente sbagliati. L'altra risposta (di ilkkachu) è corretta. stracenon (e non può, in alcun modo semplice) tracciare gli altri comandi nella pipeline della shell. Piuttosto, wsta cercando gli attuali comandi eseguiti sul tuo terminale (e altri terminali), e corre attraverso il grep come parte del suo lavoro.
R .. GitHub smette di aiutare ICE il

Corretto, grazie, ho aggiornato la mia risposta.
Arkadiusz Drabczyk,

15

Dalla manpagew(1) :

w visualizza le informazioni sugli utenti attualmente sulla macchina e sui loro processi

Per visualizzare i processi degli utenti, passa attraverso tutti i processi in esecuzione sulla macchina. Proviamo questo:

$ strace -o w.trace w | grep whatever

All'interno della traccia troviamo linee come queste (su un sistema Linux):

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

Che mostra wesplicitamente passare attraverso /proce guardare le linee di comando di tutti i processi (e altre cose, non mostrate). Essa trova il grepche corre parallela ad essa e questo è quello che stracevede fare. La pipe non ha nulla a che fare con essa, a parte l'avvio di entrambi i processi contemporaneamente. In un certo senso, è simile a ps | grepvedere lo stesso grep.

who e la maggior parte degli altri comandi non ha bisogno delle informazioni sui processi e non cerca, quindi non si vede lo stesso quando li si traccia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.