เหตุใดคำสั่ง find จึงระเบิดใน / run /


13

ฉันใช้คำสั่งต่อไปนี้เพื่อตรวจสอบเวอร์ชั่นของไพ ธ อนตามที่ได้รับคำตอบนี้ มันทำงานยกเว้นข้อผิดพลาดหนึ่งที่แสดงด้านล่าง มีใครอธิบายได้ไหม

$ sudo find / -type f -executable -iname 'python*' -exec file -i '{}' \; \
    | awk -F: '/x-executable; charset=binary/ {print $1}' \
    | xargs readlink -f | sort -u | xargs -I % sh -c 'echo -n "%: "; % -V'

ข้อผิดพลาด:

find: ‘/run/user/1000/gvfs’: Permission denied

2
python --versionและpython3 --versionเพื่อแสดงเวอร์ชันที่ใช้งานอยู่ เราทุกคนมีรุ่น 2.x และรุ่น 3.x;)
Rinzwind

6
และข้อผิดพลาดเป็นเรื่องปกติและไม่เกิดปัญหากับคำสั่ง /run/ไม่ควรรวมอยู่ใน "ค้นหา" gvfsไม่ได้เป็นของผู้ใช้ของคุณ
Rinzwind

1
นอกจากนี้คุณยังสามารถพิมพ์ในคอนโซลและกดปุ่มแท็บสองครั้งก็จะแสดงให้ทุกคนที่ปฏิบัติการในเส้นทางของคุณเริ่มต้นด้วยpython python
Timo

7
ผู้คนเศร้าโศกดี ฉันกำลังแก้ไขคำถามค่อนข้างหนักหน่วงเพราะบางคนไม่สามารถจัดการให้ได้ตามวรรคแรก OP รู้วิธีค้นหาเวอร์ชันคำถามคือเกี่ยวกับสาเหตุที่คำสั่งนี้ (ซึ่งพบPython ทุกเวอร์ชัน) กำลังตรวจหาข้อผิดพลาดเฉพาะ หากคุณต้องการโพสต์เกี่ยวกับpython -Vและทางเลือกอื่นโปรดนำไปใช้กับคำถามที่ชักชวนข้อมูลนั้น
Oli

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

คำตอบ:


20

การอนุญาต:

$ stat -c %a /run/user/1000/gvfs
500

ดังนั้นเจ้าของเท่านั้นที่มีสิทธิ์ดำเนินการ (ซึ่งอนุญาตให้ค้นหาไดเรกทอรีได้) แต่คุณใช้sudoแล้วรูทมีสิทธิ์ที่เป็นไปได้ทั้งหมดใช่ไหม ที่จริงคุณพบข้อยกเว้น:

คำตอบของGillesบน Unix และ Linux SE นี้อธิบายว่าทำไมการปฏิเสธสิทธิ์สำหรับไดเรกทอรีนั้นซึ่งเป็นจุดยึดสำหรับ FUSE:

การจัดการขอบเขตความน่าเชื่อถือด้วยระบบไฟล์ FUSE นั้นยากเนื่องจากไดรเวอร์ระบบไฟล์กำลังทำงานในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษซึ่งต่างจากรหัสเคอร์เนลสำหรับระบบไฟล์แบบดั้งเดิม เพื่อหลีกเลี่ยงภาวะแทรกซ้อนโดยค่าเริ่มต้นระบบไฟล์ FUSE สามารถเข้าถึงได้โดยผู้ใช้ที่รันกระบวนการไดรเวอร์เท่านั้น แม้แต่รูทยังไม่ได้ผ่านการ จำกัด นี้

หากคุณเรียกใช้findคำสั่งโดยไม่มีsudo(ในฐานะผู้ใช้ของคุณเอง UID 1000) คุณจะไม่ได้รับข้อผิดพลาดนั้นเนื่องจากคุณเป็นเจ้าของไดเรกทอรี แต่คุณจะได้รับข้อผิดพลาดการอนุญาตอื่นแทนดังนั้นให้ใช้sudoคำแนะนำของ Gilles:

หากคุณกำลังค้นหาไฟล์บนระบบไฟล์โลคอลเท่านั้นให้ส่ง -xdev เพื่อค้นหา


วิธีที่ง่ายที่สุดในการตรวจสอบเวอร์ชั่นของไพ ธ อน:

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+

ฉันมีผู้ใช้เพียงคนเดียวยกเว้นรูทแล้วคุณคาดหวังว่าจะเป็นเจ้าของใคร
abdul qayyum

1
เป็นคุณ, UID 1000 คุณสามารถcdไปที่ไดเรคทอรีนั้นในฐานะผู้ใช้ปกติของคุณ แต่ไม่เป็นรูท หากคุณทำงานfindโดยไม่มีsudoคุณจะไม่เห็นข้อผิดพลาดนั้น (แต่คุณจะได้รับข้อผิดพลาดเรื่องการอนุญาตอื่น ๆ )
Zanna

2
@abdulqayyum คุณแน่ใจหรือ โดยปกติแล้วอูบุนตูจะมีผู้ใช้งานไม่กี่คนที่เกี่ยวข้องกับกระบวนการภูตต่าง ๆ ใช่พวกเขาไม่สามารถเข้าสู่ระบบและพวกเขาไม่มีโฮมได
เร็ก

7

มีหลายวิธีในการค้นหารุ่นของงูหลามที่คุณมี ต่อไปนี้เป็นสองวิธีที่คุณจะได้รับทั้ง Python 2 และ Python 3

Python เฉพาะ

ก่อนอื่นให้เรียกใช้pythonและpython3เลือกตัวเลือก--version

$ python --version
Python 2.7.12
$ python3 --version
Python 3.5.2

นี่คือเฉพาะสำหรับงูหลาม แต่โปรแกรมอื่น ๆ อีกมากมายใช้วิธีการที่คล้ายกัน

ทั่วไปสำหรับแพ็คเกจ / โปรแกรมใด ๆ

วิธีทั่วไปเพิ่มเติมคือดูแพ็คเกจที่ติดตั้ง dpkg -lจะแสดงรายการแพ็คเกจทั้งหมดของคุณ แต่คุณสามารถระบุแพ็คเกจที่คุณต้องการได้ สำหรับ python และ python3 เพียงแค่ใช้สิ่งต่อไปนี้:

$ dpkg -l 'python'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version         Architecture    Description
+++-=====================-===============-===============-================================================
ii  python                2.7.11-1        amd64           interactive high-level object-oriented language 
$ dpkg -l 'python3'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version         Architecture    Description
+++-=====================-===============-===============-================================================
ii  python3               3.5.1-3         amd64           interactive high-level object-oriented language 

ในฐานะที่เป็น titbit พิเศษ หากคุณต้องการค้นหาแพ็คเกจทั้งหมดที่มีชื่อขึ้นต้นด้วยpythonคุณสามารถใช้อักขระตัวแทน*เช่นนี้

$ dpkg -l 'python*'

ที่จะพิมพ์บรรทัดจำนวนมากด้วยแพ็คเกจ


คำตอบที่ดี แต่สคริปต์ด้านบนใช้งานได้ ฉันแค่กังวลเกี่ยวกับการปฏิเสธสิทธิ์
abdul qayyum

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