Apa yang dilakukan “w” dengan urandom?

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

Mengapa "w" membutuhkan urandom? Bagaimana cara menghindarinya?

MEMPERBARUI:

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

jadi pemfilteran yang ada hubungannya dengan urandom?

> strace who 2>&1 | grep urandom
> 

Lalu mengapa "siapa" tidak terpengaruh?

Marina Ala
sumber
1
Bukan wkebutuhan mana urandom. Itu karena Piped commands run concurrently: unix.stackexchange.com/questions/37508/…
Arkadiusz Drabczyk
@ArkadiuszDrabczyk Masuk akal. Tidak ada urandomakses dalam w kode sumber.
Rui F Ribeiro
2
Anda melihat perintah kedua di dalam pipa, Anda grepdan Anda awk. Itu tidak wmembuka /dev/urandomfile perangkat. Ini mirip denganps -aux | grep grep
Kusalananda
1
@RuiFRibeiro: benar, saya juga memeriksanya untuk memastikan. Saya pikir pertanyaan ini sekarang dapat ditandai sebagai duplikat.
Arkadiusz Drabczyk
1
Anda dapat mengajukan pertanyaan tentang unicorn: strace w 2>&1 | grep unicorns;-)
Digital Trauma

Jawaban:

8

Sebagaimana dijelaskan dalam jawaban dan komentar lain alasan apa yang Anda amati adalah cara Bashmenangani pipa. Untuk memfilter apa yang benar-benar Anda inginkan dalam situasi serupa, Anda dapat mencoba melampirkan huruf pertama dari grepargumen []seperti ini:

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

EDIT:

Sebagaimana dicatat dengan benar oleh R. dalam komentar di bawah ini sebenarnya stracetidak melihat sisi lain dari pipa. Demikian pula ps aux | grep grep yang juga ditampilkan grep grepdalam outputnya wadalah berjalan melalui /procdirektori dan menemukan grepproses di sana.

Arkadiusz Drabczyk
sumber
2
Senang melihat orang lain melakukan ini (walaupun saya biasanya mengurung huruf terakhir sebagai gantinya) dengan ps / strace dll. Cara termudah untuk mencegahnya menemukan baris perintah sendiri.
Monty Harder
Trik ini sepertinya mulai dikenal luas. Saya pernah mendengar bahwa itu tercantum dalam beberapa FAQ, dan disebutkan berulang kali di sini di Stack Exchange .
Scott
1
Jawaban ini, dan komentar pada pertanyaan itu sendiri mengatakan kira-kira hal yang sama, sama sekali salah. Jawaban lainnya (oleh ilkkachu) benar. stracetidak (dan tidak bisa, dengan cara mudah) melacak perintah lain dalam pipa shell. Sebaliknya, wmencari perintah saat ini sedang dieksekusi di terminal Anda (dan terminal lainnya), dan berjalan melintasi grep sebagai bagian dari pekerjaannya.
R .. GitHub BERHENTI MEMBANTU ICE
Benar, thx, saya memperbarui jawaban saya.
Arkadiusz Drabczyk
15

Dari halaman manualw(1) :

w menampilkan informasi tentang pengguna yang saat ini ada di mesin, dan prosesnya

Untuk menampilkan proses pengguna, ia melewati semua proses yang berjalan pada mesin. Mari kita coba ini:

$ strace -o w.trace w | grep whatever

Di dalam jejak kami menemukan baris seperti ini (pada sistem Linux):

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

Yang menunjukkan wsecara eksplisit melalui /procdan melihat baris perintah dari semua proses (dan hal-hal lain, tidak ditampilkan). Ia menemukan grepyang berjalan sejajar dengannya dan itulah yang stracemelihatnya berfungsi. Pipa itu tidak ada hubungannya dengan itu, selain memulai kedua proses pada saat yang sama. Di satu sisi, ini mirip dengan ps | grepmelihat grep itu sendiri.

who dan sebagian besar perintah lain tidak memerlukan informasi tentang prosesnya, dan jangan mencari, sehingga Anda tidak melihat hal yang sama saat melacaknya.

ilkkachu
sumber