O que "w" faz com o urandom?

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

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

ATUALIZAR:

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

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

> strace who 2>&1 | grep urandom
> 

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

Marina Ala
fonte
1
Não é o wque precisa urandom. É porque Piped commands run concurrently: unix.stackexchange.com/questions/37508/…
Arkadiusz Drabczyk,
@ArkadiuszDrabczyk Faz sentido. Não há urandomacesso no w código fonte.
Rui F Ribeiro
2
Você está vendo o segundo comando no pipeline, seu grepe seu awk. Não está wabrindo o /dev/urandomarquivo do dispositivo. É semelhante aps -aux | grep grep
Kusalananda
1
@RuiFRibeiro: correto, eu também verifiquei para ter certeza. Acho que agora essa pergunta pode ser marcada como duplicada.
Arkadiusz Drabczyk
1
Você pode fazer a pergunta sobre unicórnios: strace w 2>&1 | grep unicorns;-)
Digital Trauma

Respostas:

8

Conforme explicado em outras respostas e comentários, o motivo pelo qual você observa é a maneira como Bashlida com os tubos. Para filtrar o que você realmente deseja em situações semelhantes, tente colocar a primeira letra do grepargumento da []seguinte maneira:

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

EDITAR:

Como corretamente observado por R. no comentário abaixo, na verdade strace, não vê o outro lado do tubo. Da mesma forma ps aux | grep grep que também mostra grep grepem sua saída, westá percorrendo o /procdiretório e encontra o grepprocesso lá.

Arkadiusz Drabczyk
fonte
2
Fico feliz em ver alguém fazendo isso (embora eu costumo colocar a última letra) com ps / strace etc. A maneira mais fácil de impedir que ela encontre sua própria linha de comando.
Monty mais dura
Esse truque parece estar se tornando amplamente conhecido. Ouvi dizer que ele está listado em algumas perguntas frequentes e é mencionado várias vezes aqui no Stack Exchange .
Scott
1
Esta resposta, e os comentários sobre a pergunta em si que dizem aproximadamente a mesma coisa, estão simplesmente errados. A outra resposta (de ilkkachu) está certa. stracenão (e não pode, de maneira fácil) rastrear os outros comandos no pipeline do shell. Em vez disso, westá procurando os comandos atuais sendo executados no seu terminal (e em outros terminais) e é executado no grep como parte de seu trabalho.
R .. GitHub Pare de ajudar o gelo
Correto, thx, atualizei minha resposta.
precisa saber é o seguinte
15

Na página de manualw(1) :

w exibe informações sobre os usuários atualmente na máquina e seus processos

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 estas (em um sistema Linux):

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

O que mostra wexplicitamente percorrer /proce examinar as linhas de comando de todos os processos (e outras coisas, não mostradas). Ele encontra o grepque corre paralelo a ele e é isso que straceele 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 | grepver o próprio grep.

who e a maioria dos outros comandos não precisa das informações sobre os processos e não procura, portanto você não vê o mesmo ao rastreá-los.

ilkkachu
fonte