Linux find lệnh đang hoạt động sai


14

Tìm kiếm dịch vụ giải quyết hệ thống sau khi tiết lộ lỗ hổng gần đây, tôi đã thấy một hành vi rất lạ từ lệnh find.

 root@localhost:/# find . -name "*systemd-resolved*"
./usr/share/man/man8/systemd-resolved.service.8.gz
./usr/share/man/man8/systemd-resolved.8.gz

Lệnh trả về 0 hoặc hai dòng làm đầu ra cho lần chạy đầu tiên. Nhưng nếu tôi chạy lệnh lần thứ hai tôi nhận được:

root@localhost:/# find . -name "*systemd-resolved*"
./usr/share/man/man8/systemd-resolved.service.8.gz
./usr/share/man/man8/systemd-resolved.8.gz
./lib/systemd/systemd-resolved
./lib/systemd/system/systemd-resolved.service.d
./lib/systemd/system/systemd-resolved.service

Điều này có nghĩa là lần đầu tiên, "tìm" không thực sự tìm thấy mọi thứ. Ngoài ra điều này chỉ xảy ra một lần. Chạy lệnh lần sau cho thấy đầu ra chính xác. Tôi đã kiểm tra điều này trên một số hệ thống khác có cài đặt Debian 8 (jessie). Trên những người có Kernel 4.9+ thì vấn đề chính xác này luôn xảy ra nhưng trên các hệ thống có kernel 3.16 thì không xảy ra.
Sau khi hệ thống khởi động lại tất cả điều này xảy ra một lần nữa. Nhưng hành vi là như nhau cho mỗi hệ thống cá nhân. Điều đó có nghĩa là nếu kiểm tra trên một hệ thống cụ thể trả về (sai) hai dòng đầu ra cho lần chạy đầu tiên và đầu ra đúng cho lần chạy thứ hai, thì lần chạy đầu tiên của lệnh sau khi khởi động lại hệ thống sẽ in lại 2 dòng. Vì vậy, các hệ thống hiển thị hành vi tương tự sau mỗi lần khởi động lại (theo thử nghiệm của tôi). Chi tiết tập tin như sau:

-rw-r--r-- 1 root root  ./usr/share/man/man8/systemd-resolved.service.8.gz
lrwxrwxrwx 1 root root  ./usr/share/man/man8/systemd-resolved.8.gz -> systemd-resolved.service.8.gz
-rwxr-xr-x 1 root root  ./lib/systemd/systemd-resolved
drwxr-xr-x 2 root root  ./lib/systemd/system/systemd-resolved.service.d
-rw-r--r-- 1 root root  ./lib/systemd/system/systemd-resolved.service

EDIT: Đối với tất cả những người đề xuất vấn đề có thể liên quan đến trường hợp cụ thể này đối với các tệp cụ thể này: " giải quyết hệ thống " chỉ là ví dụ. Điều này xảy ra khi tìm kiếm các từ khóa khác quá. Đây là một ví dụ khác cho kết quả sai trong lần chạy đầu tiên:

root@localhost:/# find . -name "*apache*"

Không có ai ở đây có thể kiểm tra vấn đề này trên Debian 8 với kernel mới nhất từ ​​kho lưu trữ backport?


2
Bạn có thể thử so sánh dấu vết của hai cuộc gọi, ví dụ như sử dụng stracekhông? Hệ điều hành nào bạn quan sát thấy hành vi bị lỗi trên? Bạn có ý nghĩa gì khi "trả về 0 hoặc hai kết quả như trên"? Không hoặc hai dòng đầu ra, hoặc mã thoát 0 + hai dòng? Nó có xảy ra lần nữa sau khi bắt đầu một shell mới hoặc khởi động lại không? Có thể có liên quan rằng cuộc gọi đầu tiên chỉ trả về các tệp, trong khi cuộc gọi thứ hai trả về các tệp và thư mục.
l0b0

1
@ l0b0 Như tôi đã nói, nó xảy ra trên Debian với Kernel 4.9 trong nhiều hệ thống. Tôi đã không kiểm tra các bản phát hành khác. 0 hoặc 2 có nghĩa là không hoặc hai dòng đầu ra. Nó xảy ra sau mỗi lần khởi động lại. Tuyên bố cuối cùng của bạn không áp dụng ở đây. Nó cố gắng trả lại mọi thứ. Cả thư mục và tập tin.
user2808671

1
@ l0b0 Chà tôi không chắc bạn đang tìm gì, nhưng như bạn thấy tôi đã đề cập đến lệnh để người ta có thể tái tạo vấn đề. Lệnh đó phải trả về tất cả các đường dẫn chứa "systemd-phân giải" nhưng nó sẽ không. Có tổng cộng năm đường dẫn thỏa mãn điều kiện này nhưng chương trình "tìm" chỉ trả về hai trong số chúng hoặc một hoặc không. Điều quan trọng ở đây là công cụ đưa ra đầu ra sai và bỏ lỡ một số đường dẫn chính xác. Và như tôi đã đề cập, tôi đã kiểm tra điều này trên các hệ thống khác với Debian, những người có kernel 4.9 có vấn đề này. Đây có thể là một cái gì đó nghiêm trọng ngoài không gian người dùng.
user2808671

2
@MarkWagner Không. Tôi đã điền một báo cáo lỗi cho cả danh sách gửi thư của gnu và danh sách gửi thư của Debian. Điều này có vẻ rất nghiêm trọng đối với tôi vì nguồn gốc của vấn đề này có thể ảnh hưởng đến nhiều thứ khác mặc dù tôi không biết liệu các bạn có đồng ý với tôi không. Dù sao "tìm" là một công cụ rất phổ biến và đầu ra của nó phải đáng tin cậy.
dùng2808671

2
Làm thế nào được /lib/systemdgắn kết? Đó là loại hệ thống tập tin nào? Nếu nó một riêng biệt điểm gắn kết, những gì thời gian là nó gắn?
Andrew Henle

Câu trả lời:


4

Phiên bản mặc định của findutils được cài đặt trên Debian 8 là 4.4.2 và đây là phiên bản mới nhất trên kho của jessie. Tôi tải xuống phiên bản mới nhất (4.6.0) của mã nguồn findutils và xây dựng các nhị phân từ nguồn. Sau đó, tôi đã thực hiện các bài kiểm tra tương tự và lệnh "find" cho thấy đầu ra chính xác cho lần chạy đầu tiên.

Sau đó, tôi đã tải xuống mã nguồn phiên bản 4.4.2 từ kho lưu trữ gnu và biên dịch nó. Vấn đề tương tự đã xảy ra đối với lệnh find được biên dịch. Vì vậy, vấn đề này không xảy ra với findutils 4.6.0.

Nhưng tôi vẫn không biết tại sao một số người dùng không nhận được kết quả tương tự khi sử dụng findutils 4.4.2 (phiên bản mặc định của tiện ích được cài đặt trên Debian) và không biết tại sao Debian vẫn được phát hành với phiên bản findutils cũ này và có thể các tiện ích Linux khác và gây ra tình huống có vấn đề này. Và điều cuối cùng là lý do kỹ thuật chính xác của những gì kỳ lạ đã xảy ra vẫn chưa được biết là điều không mong muốn. Bởi vì tôi không chắc có điều gì đáng lo ngại trong môi trường HĐH của mình khô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.