Что «ш» делает с урандом?

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

Зачем "W" нужен случайный? Как этого избежать?

ОБНОВИТЬ:

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

так что фильтрация как-то связана с урандом?

> strace who 2>&1 | grep urandom
> 

Тогда почему «кто» не пострадал?

Марина Ала
источник
1
Это не то, wчто нужно urandom. Это потому что Piped commands run concurrently: unix.stackexchange.com/questions/37508/…
Аркадиуш Драбчик
@ArkadiuszDrabczyk Имеет смысл. Нет urandomдоступа в w исходном коде.
Руи Ф. Рибейро
2
Вы видите вторую команду в конвейере, вашу grepи вашу awk. Это не wоткрытие /dev/urandomфайла устройства. Это похоже наps -aux | grep grep
Кусалананда
1
@RuiFRibeiro: правильно, я тоже проверил это. Я думаю, что этот вопрос теперь можно пометить как дубликат.
Аркадиуш Драбчик
1
Вы можете задать вопрос о единорогах: strace w 2>&1 | grep unicorns;-)
Цифровая травма

Ответы:

8

Как объясняется в других ответах и ​​комментариях, причина того, что вы наблюдаете, заключается в способе Bashобработки труб. Чтобы отфильтровать то, что вы действительно хотите в подобных ситуациях, вы можете попытаться заключить первую букву grepаргумента []следующим образом:

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

РЕДАКТИРОВАТЬ:

Как правильно заметил Р. в комментарии ниже, на самом деле straceне видит другую сторону трубы. Аналогично тому, ps aux | grep grep что также показывает grep grepв своем выводе, wидет через /procкаталог и находит grepтам процесс.

Аркадиуш Драбчик
источник
2
Рад видеть, что кто-то еще делает это (хотя я обычно вместо этого заключаю в скобки последнюю букву) с помощью ps / strace и т. Д. Самый простой способ не дать ему найти собственную командную строку.
Монти Хардер
Этот трюк, кажется, становится широко известным. Я слышал, что он указан в некоторых часто задаваемых вопросах, и он упоминался много раз здесь, на Stack Exchange .
Скотт
1
Этот ответ и комментарии к самому вопросу, говорящие примерно одно и то же, просто ошибочны. Другой ответ (по ilkkachu) является правильным. straceне отслеживает (и не может каким-либо простым способом) другие команды в конвейере оболочки. Скорее, wищет текущие команды, выполняемые на вашем терминале (и других терминалах), и проходит через grep как часть своей работы.
R .. GitHub ОСТАНОВИТЬСЯ, ПОМОГАЯ ЛЬДУ
Правильно, спасибо, я обновил свой ответ.
Аркадиуш Драбчик
15

Из справочной страницыw(1) :

w отображает информацию о пользователях, находящихся в данный момент на компьютере, и их процессах

Чтобы отобразить пользовательские процессы, он проходит через все процессы, запущенные на машине. Давайте попробуем это:

$ strace -o w.trace w | grep whatever

Внутри трассировки мы находим такие строки (в системе Linux):

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

Который показывает wявное прохождение /procи просмотр командных строк всех процессов (и других вещей, не показаны). Он находит то, grepчто идет параллельно с ним, и вот что straceон видит. Канал не имеет к этому никакого отношения, кроме запуска обоих процессов одновременно. В некотором смысле это похоже ps | grepна саму grep.

who и большинству других команд не нужна информация о процессах, и они не ищут, поэтому вы не видите их при отслеживании.

ilkkachu
источник