ทำไม . ไม่ได้อยู่ในเส้นทางโดยค่าเริ่มต้น?


63

บนระบบที่เหมือน UNIX ในช่วงหลายปีที่ผ่านมา (ส่วนใหญ่เกี่ยวข้องกับฉัน, Linux) ฉันสังเกตว่า.(ปัจจุบัน dir) ไม่เคยเป็น$PATHค่าเริ่มต้น ทำไมนี้

ฉันจำได้ว่าเคยอ่านเมื่อหลายปีก่อนว่ามันเป็นปัญหาด้านความปลอดภัย แต่บทความที่ฉันอ่านไม่ได้อธิบายว่าปัญหานั้นเป็นอย่างไร เป็นเพราะใครบางคนสามารถออกจากรุ่นที่เป็นอันตรายlsหรือcpในไดเรกทอรีและฉันจะจบลงด้วยการทำงานโดยไม่ทราบว่ามีอยู่หรือไม่


6
มันไม่มากสำหรับการปกป้องผู้ใช้แบบโต้ตอบเช่นเดียวกับโปรแกรมอื่น ๆ (และสคริปต์) ที่รันโปรแกรมอื่น แม้แต่ผู้ใช้ที่มีความชำนาญบางคนก็รู้ว่าเมื่อพวกเขาอยู่ในไดเรกทอรีสุ่มที่lsจะเป็น/usr/bin/lsและ./lsไม่ นอกจากนี้ยังมีอุปสรรค์ถ้าคุณรู้วิธีเพิ่ม.ไปยังจุดสิ้นสุดของเส้นทางของคุณคุณอาจมีความคิดว่าคุณกำลังทำอะไรอยู่ รากควรไม่เคยมี.อยู่ในเส้นทางของระบบจำนวนมากไม่ได้ให้เข้าสู่ระบบรากในอีกต่อไป
msw

คำตอบ:


41

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

แน่นอนว่านี่เป็นมาตรการป้องกันไวรัสที่อ่อนแอและไร้ประโยชน์และไม่มีอะไรหยุดคุณจากการเพิ่มจุดลงในเส้นทางด้วยตัวคุณเอง


13
เป็นเรื่องตลก แต่ที่คุณได้รับการปกป้องจากสิ่งนี้ แต่ไม่ใช่ไฟล์เดียว-rfในไดเรกทอรี (ทำให้rm *น่าสนใจ) ;-)
Joey

คำตอบที่ Unix: ทำไมคุณถึงตั้งชื่อไฟล์-rfตั้งแต่แรก? ;)
msw

2
@msw: คำตอบ Unix อีกคำตอบคือปกติแล้วจุดในเส้นทางจะถูก frowned สำหรับบัญชีผู้ดูแลระบบ แต่ก็ใช้ได้สำหรับผู้ที่ไม่ใช่ผู้ดูแลระบบ
harrymc

จะมีความเสี่ยงจะลดลงอย่างมากถ้าเส้นทางปัจจุบันเป็นสุดท้ายเส้นทางเพื่อให้ทุกคนในสถานที่ปกติสำหรับโปรแกรมที่ถูกตรวจสอบครั้งแรก ?
Jon z

1
@ จอนซ์: ไม่จริง แต่ความเสี่ยงนั้นค่อนข้างเล็กหากคอมพิวเตอร์ของคุณสะอาดจากไวรัส และถ้าคอมพิวเตอร์ติดไวรัสแล้วด้วยไวรัสที่ทันสมัยเส้นทางที่เป็นกังวลน้อยที่สุดของคุณ
harrymc

4

ใช่. หากคุณใส่ "." ในเส้นทางคุณจะสิ้นสุดการส่งคำสั่งโทรไปยังไฟล์ในไดเรกทอรีปัจจุบันของคุณ

แม้ว่ามันจะเป็นครั้งสุดท้ายยังคงมีข้อผิดพลาดของนักบิน ตัวอย่างเช่น Solaris 10 ไม่มี "top" ฉันพิมพ์ "top" ในระบบตลอดทั้งวันเพราะฉันคิดว่าฉันใช้ระบบที่มี "top"


1

ขออภัยฉันต้องการถามสิ่งนี้ในรูปแบบของความคิดเห็นต่อคำตอบที่เลือก แต่ฉันยังไม่มีตัวแทนใน superuser เลย

คำตอบการรักษาความปลอดภัยทำให้รู้สึก แต่ถ้าคุณใส่ "." ใน PATH ของคุณเป็นสิ่งสุดท้ายเชลล์ไม่ควรดูในไดเรกทอรีปัจจุบันครั้งสุดท้ายเมื่อค้นหาไฟล์ปฏิบัติการและลดความเสี่ยงด้านความปลอดภัย? หากพบคำสั่ง $ PATH ก็จะพบ / bin / ls ก่อนที่จะพบ. / ls

ดังนั้นวิธีที่ไม่ปลอดภัยสำหรับฉันคือใส่ "." ในตอนท้ายของตัวแปรสภาพแวดล้อม $ PATH ของฉัน

มันทำงานได้ตามที่ฉันแนะนำ นี่คือวิธีที่ฉันทดสอบ:

ก่อนอื่นเพิ่ม "." ไปที่จุดสิ้นสุดของตัวแปรสภาพแวดล้อม PATH ของคุณ

จากนั้นใส่ไฟล์ต่อไปนี้ในบางไดเร็กทอรีเช่น ~ / dir1 / dir2 / test_which.rb:

#!/your/path/to/ruby

puts "this file is from the current directory"

และวางไฟล์นี้ที่ /usr/bin/test_which.rb

#!/your/path/to/ruby

puts "this file is at /usr/bin/test_which.rb"

ต้องแน่ใจว่าได้ chmod + x ไฟล์เพื่อให้สามารถเรียกใช้

ตอนนี้ถ้าคุณเปลี่ยนไดเรกทอรีเป็น ~ / dir1 / dir2 และรัน test_which.rb คุณจะได้ผลลัพธ์

this file is at /usr/bin/test_which.rb

แน่นอนถ้าคุณเรียกใช้ "ซึ่ง test_which.rb" จากที่ใดก็ควรรายงาน

/usr/bin/test_which.rb

คุณยังสามารถเรียกใช้งานไฟล์ในไดเรกทอรีปัจจุบันได้โดยพิมพ์:

./test_which.rb

8
ไม่มีใครเคยทำพิมพ์ผิดเช่นdcหรือslหรือsduoในเปลือกและถูกบันทึกไว้โดยคำสั่ง "ไม่พบ" เคย
Daniel Beck

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

@DanielBeck คุณควรลองใช้ชื่อแทนสำหรับการพิมพ์ผิด ฉันมีการกำหนดค่าที่ต้องการของฉันls(เอาท์พุทสีและอื่น ๆ ) เป็นนามแฝงlซึ่งการแจกจ่ายทั้งหมดมีความผิดพลาด
Karl Damgaard Asmussen

1
@KarlDamgaardAsmussen kl
deworde

ฉันเองไม่ได้เพิ่ม '.' เส้นทางของฉัน มันไม่ยากที่จะพิมพ์. / วิ่งหรืออะไรก็ตามที่ฉันต้องการจะทำใน dir ท้องถิ่น มันช่วยฉันสองสามครั้งจากการเก็บสิ่งที่ไม่คาดคิด มะเขือเทศ tomahto
Michael Mathews

1

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

โดยเฉพาะอย่างยิ่งสิ่งนี้เป็นจริงเมื่อเขียนสคริปต์ที่เก็บตัวแปร PATH ของผู้ใช้ สคริปต์ที่เป็นลายลักษณ์อักษรที่ดีควรจัดการกับตัวพิมพ์เล็กทั้งหมด (เช่นชื่อไฟล์ที่มีช่องว่างหรือเริ่มต้นด้วย '-') แต่มันเป็นไปไม่ได้ที่จะป้องกันไฟล์ในไดเรกทอรีปัจจุบันที่ถูกดำเนินการแทนคำสั่งระบบ ...

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