Những gì mà Www làm gì với urandom?


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

Tại sao "w" cần urandom? Làm thế nào để tránh điều này?

CẬP NHẬT:

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

Vì vậy, đó là bộ lọc có liên quan đến urandom?

> strace who 2>&1 | grep urandom
> 

Vậy thì tại sao "ai" không bị ảnh hưởng?


1
Đó không phải là wnhu cầu urandom. Đó là becase Piped commands run concurrently: unix.stackexchange.com/questions/37508/ trộm
Arkadiusz Drabchot

@ArkadiuszDrabchot Làm cho ý nghĩa. Không có urandomquyền truy cập trong w mã nguồn.
Rui F Ribeiro

2
Bạn đang thấy lệnh thứ hai trong đường ống, của bạn grepvà của bạn awk. Nó không wmở /dev/urandomtập tin thiết bị. Nó tương tự nhưps -aux | grep grep
Kusalananda

1
@RuiFRibeiro: chính xác, tôi cũng đã kiểm tra nó để đảm bảo. Tôi nghĩ rằng câu hỏi này có thể được đánh dấu là một bản sao.
Arkadiusz Drabchot

1
Bạn có thể đặt câu hỏi về kỳ lân: strace w 2>&1 | grep unicorns;-)
Chấn thương kỹ thuật số

Câu trả lời:


8

Như đã giải thích trong các câu trả lời và nhận xét khác, lý do cho những gì bạn quan sát là cách Bashxử lý các đường ống. Để lọc những gì bạn thực sự muốn trong các tình huống tương tự, bạn có thể cố gắng gửi kèm theo chữ cái đầu tiên của grepđối số []như sau:

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

BIÊN TẬP:

Như R. đã lưu ý chính xác trong bình luận dưới đây trong thực tế stracekhông thấy phía bên kia của đường ống. Tương tự như vậy ps aux | grep grep cũng cho thấy grep greptrong đầu ra của nó wlà đi qua /procthư mục và tìm thấy grepquá trình ở đó.


2
Rất vui khi thấy người khác làm điều này (mặc dù tôi thường đóng dấu chữ cái cuối cùng thay thế) bằng ps / strace, v.v ... Cách dễ nhất để giữ cho nó không tìm thấy dòng lệnh của riêng mình.
Monty Harder

Thủ thuật này dường như đang được biết đến rộng rãi. Tôi đã nghe nói rằng nó được liệt kê trong một số Câu hỏi thường gặp và được đề cập nhiều lần ở đây trên Stack Exchange .
Scott

1
Câu trả lời này, và các ý kiến ​​về chính câu hỏi nói gần giống nhau, chỉ đơn giản là sai. Câu trả lời khác (bởi ilkkachu) là đúng. stracekhông (và không thể, theo bất kỳ cách dễ dàng nào) theo dõi các lệnh khác trong đường ống shell. Thay vào đó, wđang tìm kiếm các lệnh hiện tại đang được thực thi trên thiết bị đầu cuối của bạn (và các thiết bị đầu cuối khác) và chạy trên grep như một phần công việc của nó.
R .. GitHub DỪNG GIÚP ICE

Đúng, thx, tôi cập nhật câu trả lời của tôi.
Arkadiusz Drabchot

15

Từ trang hướng dẫnw(1) :

w hiển thị thông tin về người dùng hiện tại trên máy và quy trình của họ

Để hiển thị các quy trình của người dùng, nó phải trải qua tất cả các quy trình đang chạy trên máy. Chúng ta hãy cố gắng này:

$ strace -o w.trace w | grep whatever

Bên trong dấu vết, chúng tôi tìm thấy những dòng như thế này (trên hệ thống Linux):

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

Điều này cho thấy wrõ ràng đi qua /procvà nhìn vào các dòng lệnh của tất cả các quy trình (và những thứ khác, không được hiển thị). Nó tìm thấy grepcái chạy song song với nó và đó là những gì stracenhìn thấy nó làm. Các đường ống không có gì để làm với nó, ngoài việc bắt đầu cả hai quá trình cùng một lúc. Theo một cách nào đó, nó tương tự như ps | grepnhìn thấy grep chính nó.

who và hầu hết các lệnh khác không cần thông tin về các quy trình và không tìm kiếm, vì vậy bạn không thấy tương tự khi truy tìm chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.