คำสั่ง find Linux ทำงานผิดปกติ


14

ค้นหาบริการที่ได้รับการแก้ไขระบบตามการเปิดเผยช่องโหว่เมื่อเร็ว ๆ นี้ฉันมาเพื่อดูพฤติกรรมแปลก ๆ จากคำสั่ง find

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

คำสั่งส่งคืน 0 หรือสองบรรทัดเป็นเอาต์พุตสำหรับการรันครั้งแรก แต่ถ้าฉันรันคำสั่งในครั้งที่สองฉันจะได้รับ:

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

นี่หมายถึงเป็นครั้งแรกที่ "ค้นหา" ไม่พบทุกสิ่ง นอกจากนี้สิ่งนี้เกิดขึ้นเพียงครั้งเดียว การรันคำสั่งครั้งต่อไปจะแสดงเอาต์พุตที่ถูกต้อง ฉันตรวจสอบเรื่องนี้ในบางระบบที่ติดตั้ง Debian 8 (jessie) สำหรับผู้ที่มีเคอร์เนล 4.9+ ปัญหานี้จะเกิดขึ้นเสมอ แต่สำหรับระบบที่มีเคอร์เนล 3.16 จะไม่เกิดขึ้น
หลังจากรีบูตระบบทั้งหมดนี้เกิดขึ้นอีกครั้ง แต่พฤติกรรมนั้นเหมือนกันสำหรับแต่ละระบบ นั่นหมายความว่าหากการทดสอบระบบเฉพาะส่งคืนสองบรรทัด (ผิด) สำหรับการรันครั้งแรกและเอาต์พุตที่ถูกต้องสำหรับการรันครั้งที่สองการรันครั้งแรกของคำสั่งหลังจากรีบูตระบบจะพิมพ์ 2 บรรทัดอีกครั้ง ดังนั้นระบบแสดงพฤติกรรมเดียวกันหลังจากรีบูตแต่ละครั้ง (ตามการทดสอบของฉัน) รายละเอียดไฟล์มีดังนี้:

-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

แก้ไข: ทุกคนที่แนะนำปัญหาอาจเกี่ยวข้องกับกรณีนี้เฉพาะสำหรับไฟล์เฉพาะเหล่านี้: " แก้ไขระบบ " เป็นเพียงตัวอย่าง สิ่งนี้จะเกิดขึ้นเมื่อค้นหาคำหลักอื่น ๆ ด้วย นี่เป็นอีกตัวอย่างที่ให้ผลที่ไม่ถูกต้องสำหรับการเรียกใช้ครั้งแรก:

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

ไม่มีใครที่นี่สามารถตรวจสอบปัญหานี้กับ Debian 8 ที่มีเคอร์เนลล่าสุดจากที่เก็บ backport หรือไม่?


2
คุณสามารถลองเปรียบเทียบร่องรอยของสองสายเช่นใช้strace? ระบบปฏิบัติการใดที่คุณสังเกตเห็นพฤติกรรมที่ผิดปกติ? คุณหมายถึงอะไรโดย "ส่งคืนผลลัพธ์ที่ 0 หรือสองอย่างเช่นด้านบน" เอาต์พุตเป็นศูนย์หรือสองบรรทัดหรือออกจากรหัส 0 + สองบรรทัด? มันเกิดขึ้นอีกครั้งหลังจากเริ่มเชลล์ใหม่หรือบูตใหม่? อาจเกี่ยวข้องว่าการโทรครั้งแรกจะส่งคืนไฟล์เท่านั้นในขณะที่การโทรครั้งที่สองจะส่งคืนไฟล์และไดเรกทอรี
l0b0

1
@ l0b0 อย่างที่ฉันบอกว่ามันเกิดขึ้นกับ Debian ด้วย Kernel 4.9 ในหลาย ๆ ระบบ ฉันไม่ได้ตรวจสอบสิ่งรบกวนอื่น ๆ 0 หรือ 2 หมายถึงเอาต์พุตเป็นศูนย์หรือสองบรรทัด มันเกิดขึ้นหลังจากรีบูตทุกครั้ง ใบแจ้งยอดล่าสุดของคุณใช้ไม่ได้ที่นี่ มันพยายามคืนทุกสิ่ง ทั้งไดเรกทอรีและไฟล์
user2808671

1
@ l0b0 ดีฉันไม่แน่ใจว่าสิ่งที่คุณกำลังมองหา แต่อย่างที่คุณเห็นฉันได้กล่าวถึงคำสั่งเพื่อให้สามารถทำซ้ำปัญหา คำสั่งนั้นจะต้องส่งคืนพา ธ ทั้งหมดที่มี "systemd-เด็ด" แต่จะไม่ มีเส้นทางทั้งหมดห้าเส้นทางที่เป็นไปตามเงื่อนไขนี้ แต่โปรแกรม "ค้นหา" จะคืนค่าสองเส้นทางหรือหนึ่งหรือศูนย์ สิ่งที่สำคัญคือเครื่องมือนี้กำลังให้เอาต์พุตผิดและพลาดเส้นทางที่ถูกต้อง และอย่างที่ฉันบอกไปฉันได้ตรวจสอบสิ่งนี้กับระบบอื่นที่มี Debian ผู้ที่มีเคอร์เนล 4.9 มีปัญหา นี่อาจเป็นสิ่งที่ร้ายแรงเกินกว่าพื้นที่ของผู้ใช้
user2808671

2
@ MarkWagner ไม่ฉันเติมรายงานบั๊กให้กับทั้ง gnu findutils และรายชื่อผู้รับจดหมาย backport ของ Debian นี่เป็นเรื่องที่ร้ายแรงมากสำหรับฉันเนื่องจากสาเหตุของปัญหานี้อาจส่งผลกระทบต่อสิ่งอื่นมากมายแม้ว่าฉันจะไม่รู้ว่าพวกคุณเห็นด้วยกับฉันหรือไม่ อย่างไรก็ตาม "find" เป็นเครื่องมือที่ได้รับความนิยมอย่างมากและผลลัพธ์จะต้องเชื่อถือได้
user2808671

2
วิธีการ/lib/systemdติดตั้ง? มันเป็นระบบไฟล์ประเภทใด? ถ้ามันแยกจุดการกำหนดสิ่งที่เวลามันเป็นติด?
Andrew Henle

คำตอบ:


4

เวอร์ชันเริ่มต้นของ findutils ที่ติดตั้งบน Debian 8 คือ 4.4.2 และนี่เป็นรุ่นใหม่ล่าสุดของที่เก็บ jessie ฉันดาวน์โหลดเวอร์ชั่นล่าสุด (4.6.0) ของซอร์สโค้ด findutils และสร้างไบนารีจากซอร์สโค้ด จากนั้นฉันก็ทำการทดสอบเดียวกันและคำสั่ง "find" แสดงผลลัพธ์ที่ถูกต้องสำหรับการรันครั้งแรก

จากนั้นฉันดาวน์โหลด findutils ซอร์สโค้ด4.4.2จากไฟล์เก็บถาวร gnu และเรียบเรียง ปัญหาเดียวกันนี้เกิดขึ้นสำหรับคำสั่ง find ที่คอมไพล์แล้ว ดังนั้นปัญหานี้ไม่ได้เกิดขึ้นกับ findutils 4.6.0

แต่ฉันก็ยังไม่รู้ว่าทำไมผู้ใช้บางคนถึงไม่ได้ผลลัพธ์เดียวกันโดยใช้ findutils 4.4.2 (เวอร์ชันเริ่มต้นของยูทิลิตี้ที่ติดตั้งบน Debian) และไม่รู้ว่าทำไม Debian ถึงยังคงวางจำหน่ายกับ findutils รุ่นเก่านี้ และอาจเป็นโปรแกรมอรรถประโยชน์ Linux อื่น ๆ และทำให้เกิดปัญหานี้ และสิ่งสุดท้ายคือเหตุผลทางเทคนิคที่แน่นอนของสิ่งที่เกิดขึ้นแปลก ๆ ที่ยังไม่ทราบซึ่งไม่เป็นที่ต้องการ เพราะฉันไม่แน่ใจว่ามีบางสิ่งที่น่าเป็นห่วงในสภาพแวดล้อมระบบปฏิบัติการของฉันหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.