O que o “w” faz com o urandom?

7
> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep
> strace w 2>&1 | awk '/urandom/'
read(4, "awk
> strace who 2>&1 | grep urandom
> 
/urandom/
> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep
> strace w 2>&1 | awk '/urandom/'
read(4, "awk
> strace who 2>&1 | grep urandom
> 
/urandom/%pre%", 2047) = 14 >
urandom%pre%", 2047) = 22 >
", 2047) = 14 >
urandom%pre%", 2047) = 22 >

Por que "w" precisa de urandomidade? Como evitar isso?

ATUALIZAÇÃO:

%pre%

então é a filtragem que tem algo a ver com a urandom?

%pre%

Então, por que o "não" é afetado?

    
por Marina Ala 24.04.2017 / 19:56

2 respostas

8

Como explicado em outras respostas e comenta a razão para o que você observar é o caminho Bash lida com tubos. Para filtrar o que você realmente quer em situações semelhantes você pode tentar incluir a primeira letra do argumento grep em [] assim:

$ strace w 2>&1 | grep random
read(4, "grep
$ strace w 2>&1 | grep random
read(4, "grep%pre%random%pre%", 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
(...)
random%pre%", 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 (...)

EDITAR:

Como corretamente indicado por R. na comentário abaixo na verdade strace faz não vejo o outro lado do tubo. Similarmente a ps aux | grep grep que também mostra grep grep em sua saída w está percorrendo /proc directory e localiza grep processa lá.

    
por 24.04.2017 / 20:14
15

Na página manpage w(1) :

w displays information about the users currently on the machine, and their processes

Para exibir os processos dos usuários, ele passa por todos os processos em execução na máquina. Vamos tentar isso:

$ strace -o w.trace w | grep whatever

Dentro do rastreamento, encontramos linhas como essas (em um sistema Linux):

open("/proc/8286/cmdline", O_RDONLY)    = 4
read(4, "grep
$ strace -o w.trace w | grep whatever
whatever
open("/proc/8286/cmdline", O_RDONLY)    = 4
read(4, "grep%pre%whatever%pre%", 2047)       = 14
", 2047) = 14

Que mostra w passando explicitamente por /proc e observando as linhas de comando de todos os processos (e outras coisas, não mostradas). Ele encontra o grep que é executado paralelamente a ele e é isso que o strace vê. O pipe não tem nada a ver com isso, além de iniciar os dois processos ao mesmo tempo. De certa forma, é semelhante a ps | grep ao ver o próprio grep.

who e a maioria dos outros comandos não precisam das informações sobre os processos e não procuram, para que você não veja o mesmo ao rastreá-los.

    
por 24.04.2017 / 20:50

Tags