Random

“w”與 urandom 有什麼關係?

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

為什麼“w”需要urandom?如何避免這種情況?

更新:

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

那麼是過濾與urandom有關嗎?

> strace who 2>&1 | grep urandom
> 

那為什麼“誰”不受影響呢?

正如其他答案和評論中所解釋的,您觀察到的原因是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
(...)

編輯:

正如R.下面的評論中正確指出的那樣,實際上strace沒有看到管道的另一側。與此類似,在其輸出ps aux | grep grep 中也顯示正在遍歷 目錄並在那裡找到程序。grep grep``w``/proc``grep

從手冊頁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並且大多數其他命令不需要有關程序的資訊,也不需要查找,因此在跟踪它們時您看不到相同的資訊。

引用自:https://unix.stackexchange.com/questions/361018