เพื่อนของฉันทำการลบไฟล์ของฉันโดยใช้เทอร์มินัล ดังนั้นโปรดช่วยฉันด้วยการอธิบายวิธีสร้างรหัสผ่านสำหรับrm
คำสั่ง
unlink
คำสั่งด้วย ยังเกี่ยวกับmv
คำสั่งเพราะคุณสามารถเขียนทับไฟล์ได้อย่างมีประสิทธิภาพด้วย อีกทั้ง ...
เพื่อนของฉันทำการลบไฟล์ของฉันโดยใช้เทอร์มินัล ดังนั้นโปรดช่วยฉันด้วยการอธิบายวิธีสร้างรหัสผ่านสำหรับrm
คำสั่ง
unlink
คำสั่งด้วย ยังเกี่ยวกับmv
คำสั่งเพราะคุณสามารถเขียนทับไฟล์ได้อย่างมีประสิทธิภาพด้วย อีกทั้ง ...
คำตอบ:
ไม่มีวิธีง่ายๆในการตั้งค่ารหัสผ่านบนrm
คำสั่งนั้นไม่ใช่การแฮ็ครหัสจำนวนมากที่อาจทำลายสิ่งต่าง ๆ เช่นการapt-get
ติดตั้งแพคเกจและลบไฟล์และทำให้คุณต้องป้อนรหัสผ่านพันครั้งหรืออาจรบกวน เข้าถึงคำสั่งให้กับผู้ที่จะต้องการมัน (เช่นคุณจะลบไฟล์ของคุณเอง) คุณสามารถจัดเรียงได้โดยมีบัญชีผู้ใช้หลายบัญชีและสิทธิ์การเข้าถึงหลายชุดและ จำกัด การเข้าถึงส่วนต่างๆของข้อมูลเช่นโฮมไดเร็กตอรี่ของคุณเพื่อให้พวกเขาไม่สามารถเข้าถึงได้
(ตัวเลือกอื่นคือบัญชีผู้ใช้แต่ละบัญชีสำหรับผู้ใช้แต่ละคนจากนั้นรายการควบคุมการเข้าถึงตามรายละเอียดในคำตอบอื่น ๆที่โพสต์โดยVideonauth )
นี่คือปัญหาหลัก - คุณปล่อยให้เพื่อนของคุณใช้ระบบของคุณ สิ่งนี้มีผลกระทบด้านความปลอดภัยมากมาย - แนวคิดของ "ใครก็ตามที่สามารถเข้าถึงกล่องได้จะสามารถควบคุมระบบและทำงานต่าง ๆ ได้" คือ IT Security Mantra ซึ่งเป็นเหตุผลว่าทำไมคุณไม่แชร์การเข้าถึงระบบทางกายภาพ ยกเว้นบุคลากรผู้มีอำนาจที่เชื่อถือได้
วิธีเดียวที่มีเหตุผลอย่างแท้จริงในการทำเช่นนี้คือการไม่ให้เพื่อนของคุณเข้าถึงคอมพิวเตอร์ของคุณและให้พวกเขามีระบบ "แขก" โดยเฉพาะ "ที่พวกเขาสามารถใช้งานได้โดยที่คุณไม่สนใจไฟล์มากนัก นี่เป็นวิธีที่ปลอดภัยที่สุดในการทำให้ไฟล์ของคุณปลอดภัย
แน่นอนถ้าไม่ใช่ตัวเลือกตัวเลือกเดียวที่ปลอดภัยจริงๆของคุณคือการกำหนดค่าบัญชีผู้ใช้หลายบัญชีหนึ่งบัญชีสำหรับผู้ใช้แต่ละรายมีโฟลเดอร์บ้านที่แตกต่างกันและไม่อนุญาตให้พวกเขาเข้าถึงโฮมไดเร็กตอรี่ของคุณเอง ไดเรกทอรี จากนั้นให้ทุกสิ่งที่คุณไม่ต้องการให้พวกเขาสัมผัสในโฮมไดเร็กตอรี่ของคุณและไม่ให้พวกเขาsudo
เข้าถึงroot
รหัสผ่านหรือแชร์รหัสผ่านกับพวกเขา
นี่คือวิธีที่คุณจะทำ:
สมมติว่าชื่อของฉันคือ "Foo" และฉันต้องการให้ผู้ใช้ "บาร์" เพื่อนใช้ระบบของฉัน แต่ไม่สามารถเข้าถึงไฟล์ของฉันได้ ขั้นตอนแรกคือการปฏิเสธการเข้าถึงทุกคนยกเว้นฉันในไดเรกทอรีบ้านของฉัน นี่เป็นการอนุญาตให้ผู้ใช้รายอื่นไม่ลบไฟล์ของคุณ แต่ยังป้องกันไม่ให้ผู้ใช้รายอื่น ๆ สอดแนมในโฮมไดเร็กตอรี่ของคุณและดูประเภทของสิ่งที่คุณมีในโฮมไดเร็กตอรี่ของคุณ:
chmod 750 /home/Foo
ขั้นตอนที่สองคือการสร้างบัญชีผู้ใช้สำหรับ "บาร์" (ห้ามพิมพ์สิ่งที่อยู่ในวงเล็บด้านล่างเพื่อวัตถุประสงค์ในการให้ข้อมูลเท่านั้น) ด้วยวิธีนี้เราสามารถตรวจสอบให้แน่ใจว่าเขามีสิทธิ์การเข้าถึงแยกต่างหาก:
sudo adduser --create-home --user-group --shell /bin/bash Bar
sudo passwd Bar
(set a temporary password - you will not see characters as you type though)
สามขั้นตอนคือการ จำกัด การแล้วไดเรกทอรีบ้านของพวกเขามากเกินไปจึงไม่มีใครสามารถแงะเป็นไฟล์ของพวกเขาอย่างใดอย่างหนึ่ง นี่เป็นสิ่งที่ทำให้เท่าเทียมกัน
sudo chmod 750 /home/Bar
ล้างมือให้สะอาดล้างออกแล้วทำซ้ำขั้นตอนเหล่านี้สำหรับผู้ใช้หลายคนที่คุณมีอยู่ในระบบ พวกเขาจะไม่สามารถเข้าถึงไฟล์ของคุณและเนื่องจากคุณจะไม่ให้สิทธิ์ผู้ดูแลระบบแก่พวกเขาพวกเขาไม่สามารถลบไฟล์ของคุณโดยไม่พยายามsudo
ทำเช่นนั้น - เนื่องจากคุณไม่อนุญาตให้ทำเช่นนี้ สัมผัสสิ่งของของคุณ และพวกเขาจะไม่สามารถดูไฟล์ของคุณได้เช่นกันโดยไม่ต้องเป็น superuser ซึ่งจะไม่เกิดขึ้นที่นี่
จำไว้เสมอว่า:เมื่อให้ผู้อื่นเข้าถึงเครื่องหรือเข้าถึงโดยทั่วไปคุณจะต้องทำให้ไฟล์และข้อมูลของคุณมีความเสี่ยง นี่เป็นข้อเท็จจริงที่ได้รับการยอมรับอย่างกว้างขวางในโลก IT Security และเป็นสิ่งที่ยังคงเป็นจริง การให้เพื่อนของคุณเข้าถึงคอมพิวเตอร์ของคุณจะทำให้ข้อมูลของคุณตกอยู่ในความเสี่ยงเสมอดังนั้นให้ระบบของพวกเขายุ่งเหยิงกับพวกเขาหรือไม่ให้พวกเขาเข้าถึงเครื่องของคุณ
เพียงบันทึกการเข้ารหัสดิสก์
แม้ว่าการเข้ารหัสดิสก์จะทำงานได้ดีในการปกป้องข้อมูลของคุณจากบุคคลที่สาม แต่ก็มีข้อ จำกัด
ในขณะที่การเข้ารหัสดิสก์ไม่สามารถแก้ปัญหาเหล่านี้ได้ แต่ก็ทำให้ปวดหัวเป็นชั้น ๆ สำหรับนักแสดงภัยคุกคาม ใครที่เป็นคนเลวอาจให้ขึ้นถ้ามันมีการเข้ารหัสหรือพวกเขาอาจทรมานคุณ (คิวบังคับXKCD การรักษาความปลอดภัยการ์ตูน )
ดังนั้นหากระบบของคุณถูกเข้ารหัส แต่คุณอนุญาตให้ผู้ใช้รายอื่นใช้งานได้พวกเขามีรหัสผ่านเพื่อถอดรหัสหรือคุณออกจากแล็ปท็อปของคุณถอดรหัสเพื่อให้พวกเขาสามารถ SSH หรือเข้าถึงทางกายภาพ ในทั้งสองกรณีนี้มันแย่
ที่กล่าวว่าหากระบบของคุณไม่ได้รับการเข้ารหัสส่วนนี้จะไม่มีความเกี่ยวข้องสำหรับคุณ
apt-get
ทำงานdpkg
ซึ่งเรียกใช้สคริปต์rm
ที่มักจะใช้ ในกล่อง Xenial ของฉันcd /var/lib/dpkg/info; grep -P '\brm\b' *inst
เอาต์พุต 344 บรรทัดซึ่ง 333 ดูเหมือนการใช้rm
คำสั่งจริง - ในสคริปต์การติดตั้ง grep -P '\brm\b' *rm
แสดงมากขึ้นในสคริปต์ลบ (เพื่อลบไฟล์กำหนดค่าไม่ใช่ไฟล์แพ็คเกจ)
นี้อาจไม่ได้จริงๆจะเกี่ยวกับrm
คำสั่งตั้งแต่มีวิธีที่ง่ายต่อการลบไฟล์โดยไม่ต้องใช้มัน หากปัญหาคือเพื่อนของคุณใช้rm
คำสั่งในทางที่ผิดโดยไม่ตั้งใจดังนั้นวิธีแก้ปัญหาที่ จำกัด การใช้คำสั่งนั้นโดยเฉพาะหรือทำให้มันทำงานในวิธีที่แตกต่างกันอาจเป็นประโยชน์ ในทางตรงกันข้ามหากปัญหาคือว่าเพื่อนของคุณตั้งใจที่จะรักษาข้อมูลของคุณในแบบที่คุณไม่ต้องการคุณจะต้องใช้มาตรการรักษาความปลอดภัยที่แท้จริงและไม่มีวิธีแก้ปัญหาที่มุ่งเน้นไปที่rm
คำสั่งเอง (หรือชุดคำสั่งแยก) จะทำให้คุณปลอดภัย
สมมติว่าเพื่อนของคุณรู้ว่าคุณไม่ต้องการให้พวกเขาลบไฟล์ของคุณมีสองวิธี:
พวกเขาสามารถทำได้ตามวัตถุประสงค์ ในสถานการณ์นี้เพื่อนของคุณตั้งใจลบไฟล์ของคุณและคุณไม่สามารถเชื่อใจได้ว่าพวกเขาพยายามที่จะปฏิบัติตามความต้องการของคุณเกี่ยวกับวิธีที่พวกเขาปฏิบัติต่อข้อมูลของคุณเมื่อพวกเขาใช้คอมพิวเตอร์ของคุณ ทางออกเดียวที่จะแก้ไขปัญหานี้คือการใช้มาตรการรักษาความปลอดภัยที่เกิดขึ้นจริงที่มีประสิทธิภาพ , โทมัสวอร์ดได้อธิบายในรายละเอียด บ่อยครั้งที่มาตรการที่ดีที่สุดคือป้องกันไม่ให้ใช้คอมพิวเตอร์ของคุณ แต่การทำให้พวกเขาใช้บัญชีผู้ใช้ของตนเองสามารถให้ความคุ้มครองได้บ้าง
พวกเขาอาจทำผิดพลาด ในสถานการณ์นี้เพื่อนของคุณเกิดอุบัติเหตุได้ง่ายมากและพวกเขายังคงเรียกใช้rm
คำสั่งที่พวกเขาต้องการ พวกเขาต้องการที่จะปฏิบัติต่อคุณและข้อมูลของคุณด้วยความเคารพ แต่ในทางปฏิบัตินั้นไม่ดีจริง ๆ เพราะพวกเขาใช้คำสั่งที่ไม่ถูกต้องลบไฟล์ผิด ... หรืออะไรทำนองนั้น แม้ว่าจะเป็นการดีที่จะเชื่อว่านี่คือสิ่งที่เกิดขึ้นฉันขอเตือนคุณว่าสมมติว่าคนที่ลบข้อมูลของคุณต่อไปหลังจากที่คุณบอกให้พวกเขาหยุดทำงานโดยไม่เจตนา
นอกจากนี้แม้ว่าความตั้งใจของพวกเขาจะดีการให้บัญชีผู้ใช้แยกต่างหากยังคงเป็นวิธีที่ป้องกันไม่ได้ส่วนใหญ่ในการป้องกันไม่ให้ลบไฟล์ของคุณนอกเหนือจากการไม่อนุญาตให้ใช้คอมพิวเตอร์ของคุณ
หากสถานการณ์เป็น # 2 - เพื่อนของคุณไม่ได้พยายามลบไฟล์ของคุณ แต่ต้องการความช่วยเหลือโดยไม่ตั้งใจลบและวิธีเดียวที่พวกเขาตั้งใจลบพวกเขาโดยบังเอิญคือการใช้คำสั่งในทางที่ผิดโดยไม่ตั้งใจ (เช่นrm
) พวกเขามีปัญหาในการใช้อย่างถูกต้อง - เทคนิคในคำตอบของ Videonauthอาจเป็นประโยชน์ แต่คุณต้องเข้าใจว่าพวกเขาไม่ได้เป็นมาตรการรักษาความปลอดภัยเพราะคำสั่งเป็นเพียงหนึ่งในหลายวิธีที่ง่ายที่จะลบไฟล์ ดูรายละเอียดด้านล่างrm
ผมขอแนะนำให้คุณถามตัวเองว่า "สถานการณ์ของฉันเป็นเช่นเดียวกับถ้าผมมากกว่าคนอื่น ๆ ที่ใช้คอมพิวเตอร์ของฉันเป็นคนหนึ่งที่ใช้rm
อย่างไม่ถูกต้อง?"
หากคำตอบคือไม่แสดงว่านี่เป็นเรื่องของความปลอดภัยของข้อมูลและคุณต้องป้องกันไม่ให้เพื่อนของคุณใช้บัญชีผู้ใช้ของคุณ หากคำตอบคือใช่คุณสามารถใช้วิธีการเดียวกันกับที่คุณใช้หากคุณใช้วิธีที่ผิดrm
:
rm file
file
แต่ถึงแม้ว่าเพื่อนของคุณไม่ได้พยายามที่จะทำผิดอะไรที่คุณควรจะยังคงพิจารณามีพวกเขาใช้บัญชีผู้ใช้ของตัวเองต่างหาก สิ่งนี้จะยังคงแก้ปัญหา - มาตรการรักษาความปลอดภัยเดียวกับที่ปกป้องข้อมูลจากการถูกทำลายโดยเจตนาจะปกป้องมันจากการทำลายโดยไม่ตั้งใจเช่นกัน แม้จะไม่มีเจตนาร้าย แต่ถ้ามีคนทำในสิ่งที่คุณไม่ต้องการให้ทำคุณก็ไม่สามารถไว้ใจให้พวกเขาละเว้นการทำสิ่งนั้นได้
rm
พรอมต์ก่อนการลบสามารถช่วยป้องกันข้อผิดพลาดได้เพื่อช่วยให้คนหลีกเลี่ยงไม่ได้ตั้งใจลบไฟล์ที่มีrm
คุณสามารถทำให้นามแฝงเปลือกที่จริงวิ่ง การส่งแฟล็กเพื่อให้ผู้ใช้แจ้งก่อนลบแต่ละไฟล์ (ดู)rm
rm -i
-i
rm
man rm
คุณสามารถทำได้ (สำหรับบัญชีผู้ใช้ของคุณ) โดยเพิ่มalias rm='rm -i'
ลงในไฟล์.bash_aliases
หรือ .bashrc
ดูคำถามนี้และที่หนึ่งสำหรับรายละเอียด สิ่งนี้จะมีผลสำหรับ bash shell ที่เพิ่งเปิดใหม่
สิ่งนี้ไม่ให้ความปลอดภัยที่แท้จริงและไม่สามารถป้องกันความผิดพลาดได้เนื่องจาก:
/bin/rm
หรือยกเลิกการลบล้าง ( unalias rm
)rm
-i
rm
(เช่นในกรณีของวิธีการของ Videonauth - ดูด้านล่าง)แต่ถ้าคุณไม่ต้องการความปลอดภัยที่แท้จริง (ดูด้านบน) นี่อาจเป็นวิธีที่จะไป โดยเปรียบเทียบกับวิธีการป้องกันไม่ให้เพื่อนของคุณใช้rm
คำสั่งที่ระบบจัดเตรียมไว้ให้:
การใช้นามแฝงrm
ถึงrm -i
มีประสิทธิภาพน้อยกว่าในการป้องกันข้อผิดพลาด - จนกว่าจะใช้เทคนิคอื่นเพื่อลบไฟล์ ณ จุดนั้นการป้องกันไม่ให้ผู้ใช้ใช้งานrm
จะไม่ได้ผลทั้งหมดแม้ว่าพวกเขาจะไม่พยายามทำอะไรผิดก็ตามเนื่องจากสันนิษฐานว่าพวกเขาจะใช้unlink
(หรือคำสั่งอื่น ๆ นับไม่ถ้วนที่ลบไฟล์) ด้วยความไร้ความคิดเท่ากัน
ในอีกทางหนึ่งเนื่องจากการขยายนามแฝงเกิดขึ้นในบางสถานการณ์เท่านั้น - การพูดโดยทั่วไปการใช้เชลล์แบบโต้ตอบโดยทั่วไป - เพื่อนของคุณอาจคิดว่าพวกเขากำลังได้รับแจ้งเมื่อไม่ได้รับการแจ้งเตือนจริง ๆ (เนื่องจากคำสั่งอยู่ใน ตัวอย่างเช่นสคริปต์หรือออกจากเปลือกที่แตกต่างกัน) วิธีของ Videonauthไม่มีปัญหานี้ซึ่งเป็นข้อได้เปรียบตามวัตถุประสงค์ของวิธีการalias rm='rm -i'
นั้น
เมื่อสคริปต์ทำงานยกเว้นว่ามีการเขียนโดยเจตนาให้ใช้นามแฝงนามแฝงของคุณจะไม่ถูกขยายเข้าไป ซึ่งหมายความว่า aliasing rm
จะrm -i
มากไม่น่าจะผิดอะไร alias rm='rm -i'
นี้เป็นข้อได้เปรียบวัตถุประสงค์ของ
rm
ไม่สามารถทำสิ่งใด ๆ ที่โปรแกรมปกติสมบูรณ์แบบอื่น ๆ ไม่สามารถทำได้rm
มีจริงๆไม่มีอะไรพิเศษเกี่ยวกับ มันเป็นวิธีที่สะดวกและการจัดทำเอกสารด้วยตนเองในการลบไฟล์ดังนั้นการ จำกัด การเข้าถึงไฟล์จึงเสี่ยงต่อการทำลายสคริปต์จำนวนมากที่ต้องใช้ แต่มันอยู่ไกลจากวิธีเดียวในการลบไฟล์ - เป็นเพียงโปรแกรมทั่วไป
คำสั่งสองสามคำสั่งทำงานบางอย่างที่ผู้ใช้ที่ จำกัด (ไม่ใช่ผู้ใช้root ) ไม่สามารถดำเนินการได้หากไม่ได้ทำงาน ตัวอย่างเช่นsudo
ให้คุณเรียกใช้โปรแกรมในฐานะผู้ใช้รายอื่นหลังจากตรวจสอบเพื่อให้แน่ใจว่าคุณได้รับอนุญาต passwd
แก้ไขฐานข้อมูลที่จัดเก็บรหัสผ่านของผู้ใช้ แต่ให้คุณเปลี่ยนรหัสผ่านของคุณเองเท่านั้น (เว้นแต่ว่าคุณรูทซึ่งในกรณีนี้คุณสามารถเปลี่ยนรหัสผ่านของใครก็ได้)
/usr/bin/sudo
และ/usr/bin/passwd
สามารถทำได้เนื่องจากมีsetuid bit set ดังs
ที่ปรากฏในคอลัมน์ซ้ายสุดเมื่อคุณเรียกใช้ls -l
:
ek@Io:~$ type -a sudo passwd rm
sudo is /usr/bin/sudo
passwd is /usr/bin/passwd
rm is /bin/rm
ek@Io:~$ ls -l /usr/bin/sudo /usr/bin/passwd /bin/rm
-rwxr-xr-x 1 root root 60272 Feb 18 2016 /bin/rm
-rwsr-xr-x 1 root root 54256 Mar 29 2016 /usr/bin/passwd
-rwsr-xr-x 1 root root 136808 Aug 17 09:20 /usr/bin/sudo
ขอให้สังเกตว่า/bin/rm
ไม่มีs
: สิทธิ์ของมันคือ-rwxr-xr-x
ในขณะที่/usr/bin/passwd
และ/usr/bin/so
มี-rwsr-xr-x
แทน สิ่งนี้ทำให้มันไม่ว่าใครจะทำงานpasswd
หรือsudo
มันทำงานได้จริงในฐานะผู้ใช้รูทเนื่องจากรูทเป็นเจ้าของไฟล์ปฏิบัติการ (นอกจากนี้ยังมีบิต setgid ซึ่งเมื่อตั้งค่าจะทำให้ไฟล์ปฏิบัติการรันด้วยข้อมูลประจำตัวกลุ่มของเจ้าของกลุ่มแทนที่จะเป็นของผู้โทร)
ยกเว้นช่องโหว่ความปลอดภัยที่ยังไม่ได้ค้นพบ (หรือที่ถูกค้นพบ แต่ยังไม่ได้รับการแก้ไข) sudo
และpasswd
มีความปลอดภัยเพราะยูทิลิตี้เหล่านั้นเขียนอย่างระมัดระวังเพื่อให้พวกเขาสามารถทำสิ่งที่ผู้โทรควรได้รับอนุญาตเท่านั้น ทำ.
/bin/rm
ไม่ทำงานด้วยวิธีนี้ มันไม่ได้ setuid เพราะมันไม่จำเป็นต้องเป็น สิทธิ์ไดเรกทอรี (และสิทธิ์ไฟล์บางครั้ง ) ควบคุมไฟล์ที่ผู้ใช้สามารถลบได้และไม่จำเป็นต้องกลายเป็นรูทเพื่อทำ เพียงเพื่อจะชัดเจนสมบูรณ์โปรดอย่าที่เคยตั้งค่าบิต setuid rm
บน ผลกระทบด้านความปลอดภัยจะเป็นหายนะนับ แต่นั้นมาไม่ว่าใครจะวิ่งrm
มันก็เหมือนกับว่ารูทวิ่งมา! (ยูทิลิตี้ที่ชอบsudo
และpasswd
ตรวจสอบว่าใครกำลังใช้งานพวกเขาจริงๆและตรวจสอบว่ามีบางอย่างที่ได้รับอนุญาตก่อนที่จะทำมัน; rm
ไม่ทำสิ่งนั้น)
การตรวจสอบว่าบิต setuid (หรือ setgid) ถูกตั้งค่าบนตัวประมวลผลจะบอกคุณหรือไม่ว่าการ จำกัด ผู้ที่อาจเรียกใช้นั้นมีโอกาสในการปรับปรุงความปลอดภัยหรือไม่ ปฏิบัติการที่ไม่ได้ setuid (หรือ setgid) ไม่มีสถานะพิเศษและทุกคนสามารถคัดลอกและเรียกใช้สำเนานำสำเนาของตนเองจากเครื่องอื่นเขียนสคริปต์หรือโปรแกรมที่ทำสิ่งเดียวกันหรือใช้ โปรแกรมอื่นที่จะทำ
rm
วิธีที่ชัดเจนในการลบไฟล์ที่ไม่มีrm
ใน Ubuntu คือการนำทางไปยังตำแหน่งในเบราว์เซอร์ไฟล์กราฟิก (Nautilus หากคุณใช้ Unity หรือ GNOME Shell) แล้วลบไฟล์ rm
นอกจากนี้ยังมีคำสั่งจำนวนมากที่สามารถใช้ในการลบไฟล์จากขั้วโดยไม่เคยใช้
ตัวอย่างเช่นหากต้องการลบไฟล์ที่เรียกว่าfoo.txt
ในไดเรกทอรีปัจจุบันคำสั่งต่อไปนี้ซึ่งทำงานนอกกรอบบน Ubuntu และไม่จำเป็นต้องเข้าถึงrm
จะทำได้ (เพียงเพื่อให้แน่ใจว่าฉันทดสอบพวกเขาในระบบขั้นต่ำ 16.04ติดตั้งกับสาธารณูปโภคระบบมาตรฐานเพียงหลังจากการลบ/bin/rm
)
unlink foo.txt
busybox rm foo.txt
perl -e 'unlink("foo.txt")'
python3 -c 'import os; os.remove("foo.txt")'
( python
แทนที่จะเป็นpython3
รุ่นเก่ากว่า)แน่นอนว่ารายการนั้นไม่มีที่ไหนใกล้เสร็จสมบูรณ์ ไม่สามารถทำรายการคำสั่งทั้งหมดได้ การป้องกันการลบไฟล์เป็นหนึ่งในสิ่งที่แยกบัญชีผู้ใช้และสิทธิ์ของไฟล์และไดเรกทอรีที่มีอยู่เพื่อให้บรรลุ พวกเขาทำงานได้ดีมากเพื่อป้องกัน ในทางตรงกันข้ามการเปลี่ยนrm
คำสั่ง (เพื่อให้ต้องใช้รหัสผ่านหรือวิธีอื่นใด) หรือ จำกัด การเข้าถึงเพื่อrm
ไม่ให้ป้องกันเลย
rm
ของGNU -I
มันพร้อมท์สำหรับการลบ 4 ไฟล์ขึ้นไปหรือสำหรับการลบซ้ำ ดังนั้นคุณจึงไม่ได้รับในนิสัยของเสมอใช้-f
, \rm
เพื่อหลีกเลี่ยงการขยายตัวนามแฝงหรือพิมพ์y
โดยไม่ต้องอ่าน แต่มันจะช่วยคุณให้รอดพ้นจากการพิมพ์ผิดที่คุณต้องตีย้อนกลับไปก่อนที่คุณจะตั้งใจหรือคุณจะจับคู่ไฟล์จำนวนมาก
mv foo.txt /tmp/.gone
จากนั้นรีบูตทิ้ง tmpfs ที่สำรอง/tmp
ไว้ หรือใช้mv
เพื่อเปลี่ยนชื่อไฟล์หลาย ๆ ไฟล์ให้เป็นชื่อเดียวกันดังนั้นจึงเหลือเพียงไฟล์เดียวเท่านั้น หรือเพียงแค่ซ่อนไฟล์ด้วยการเปลี่ยนชื่อไฟล์ด้วยชื่อที่ไม่ชัดเจน ดังที่ส่วนแรกของคำตอบนี้ชี้ให้เห็นว่าหากคุณพยายามป้องกันความอาฆาตพยาบาทแทนที่จะเป็นคนไร้ความสามารถคุณจะต้องล็อคคนให้พ้นจากบัญชีของคุณ
คุณสามารถเปลี่ยนการอนุญาตใน/bin/rm
คำสั่งผ่านบรรทัดต่อไปนี้ซึ่งจะป้องกันไม่ให้มีการดำเนินการโดยไม่ต้องเข้าถึง sudo:
sudo chmod 750 /bin/rm
สิ่งนี้จะป้องกันไม่ให้พวกเขาใช้rm
คำสั่งจากระบบ คุณควรระวังว่ามันไม่ได้ป้องกันการลบไฟล์ด้วยวิธีอื่น
ในการป้องกันไม่ให้ใช้rmdir
คำสั่งซึ่งเป็นวิธีการทั่วไปในการลบไดเรกทอรีคุณสามารถตั้งค่าการอนุญาตในลักษณะเดียวกันบนพา ธ ที่สามารถใช้งานได้:
sudo chmod 750 /bin/rmdir
เตือนว่าเช่นกันคุณสามารถใช้คำสั่งนี้กับสิทธิ์ sudo เท่านั้น
หากต้องการเปลี่ยนกลับหากคุณไม่ชอบหรือปัญหาอื่น ๆ เกิดขึ้นใช้755
สำหรับchmod
ในฐานะที่เป็น @muru ชี้ให้เห็นข้างต้นเป็นโซลูชั่นที่หยาบมากและอาจหยุดบริการระบบที่ไม่ได้ทำงานบนบัญชีรูท ดังนั้นฉันจึงเพิ่มตัวเลือกอื่นที่นี่โดยใช้ ACL (รายการควบคุมการเข้าถึง) เพื่อทำสิ่งเดียวกันและอาจจะปลอดภัยกว่า ( อ่านได้ดีและคุณสามารถข้ามส่วนที่เปิดใช้งานได้เนื่องจาก ACL มักติดตั้งบนระบบ Ubuntu ในปัจจุบัน):
ดังนั้นการทำเช่นเดียวกับข้างต้นเพียงสำหรับผู้ใช้ที่คุณต้องการจะบล็อก
sudo setfacl -m u:<user-name>:- /bin/rm /bin/rmdir
เพียงแทนที่<user-name>
ด้วยชื่อผู้ใช้จริงที่คุณต้องการป้องกันการใช้ไฟล์
เช่นเดียวกับการchmod
ใช้setfacl -m
เพื่อป้องกันผู้ใช้ที่ระบุไม่ให้รันrm
และrmdir
ใช้กับคำสั่งที่ระบบจัดเตรียมไว้เท่านั้น มันไม่ได้ป้องกันพวกเขาจากการลบไฟล์และโฟลเดอร์ของคุณใน Nautilus หรือโดยใช้คำสั่งเทอร์มินัลอื่น ๆ
คำอธิบาย:
-m
ธงหมายถึงการปรับเปลี่ยนไฟล์ ACLu
หมายถึงผู้ใช้ สามารถมีค่าต่อไปนี้u
สำหรับผู้ใช้g
สำหรับกลุ่มและo
สำหรับคนอื่น ๆ ทั้งหมด<user-name>
สามารถโฮลชื่อผู้ใช้จริงหรือชื่อกลุ่มตามสิ่งที่คุณต้องการเปลี่ยนแปลง ในการตั้งค่าการเปลี่ยนแปลงโดยรวมคุณปล่อยให้มันว่างเปล่า-
จึงสามารถใส่ตัวอักษรต่อไปนี้r
สำหรับการอ่านการอนุญาตw
การเขียนและx
การดำเนินการsudo setfacl -m u:<username>:- /bin/rm /bin/rmdir
IIRC คุณสามารถทดสอบ ACL ด้วยgetfacl /bin/rm /bin/rmdir
rm
จำนวนได้อย่างมีประสิทธิภาพในการลบไฟล์โดยไม่ต้องเป็น วิธีการแก้ Videonauth ได้ให้ที่นี่เป็นวิธีที่เป็นไปได้เพื่อช่วยให้ผู้ใช้เกิดอุบัติเหตุได้ง่ายหยุดการลบสิ่งที่ แต่ก็ไม่ได้ให้การรักษาความปลอดภัยที่เกิดขึ้นจริงใด ๆ (ซึ่งอาจจะไม่เป็นไรถ้าเพื่อนของ OP จะไม่ได้จงใจพยายามที่จะล้มล้างความปรารถนาของ OP) . Videonauth: ฉันขอแนะนำให้แก้ไขโพสต์นี้เพื่อให้ชัดเจนว่ามันไม่ได้ป้องกันผู้คนจากการลบไฟล์เพราะพวกเขาไม่ต้องการrm
คำสั่งให้ทำ (ฉันละเว้นการแก้ไขด้วยตนเองในกรณีที่คุณไม่ต้องการพูดอย่างนั้น)
rm
คำสั่ง
นี่เป็นคำตอบที่ง่ายมากและจะหยุดบางคนโดยใช้คำสั่ง rm โดยไม่ต้องให้รหัสผ่าน มันไม่ใช่โซลูชันที่ปลอดภัยและคุณควรใช้คำแนะนำอื่นในคำตอบอื่น
อย่างไรก็ตามคุณสามารถใช้นามแฝงเพื่อเปลี่ยนวิธีการทำงานของคำสั่ง rm ลอง:
alias rm="sudo -l >/dev/null && rm"
สิ่งนี้จะเกิดขึ้นเมื่อมีคนป้อนคำสั่ง rm จะรันคำสั่ง sudo -l คำสั่งนี้บังคับให้ผู้ใช้ป้อนรหัสผ่าน หากพวกเขาทำให้ถูกต้องมันจะแสดงรายการสิทธิ์ของพวกเขา (เราจะลบล้างเอาต์พุตนี้) และออกจากสถานะ 0 หากพวกเขาทำผิดมันจะมีข้อผิดพลาดอยู่
จากนั้นเราปฏิบัติตามคำสั่ง sudo ด้วย "&&" ซึ่งออกจากคำสั่งต่อไปนี้ - ในกรณีนี้ "rm" เฉพาะเมื่อคำสั่งก่อนหน้าออกจากสถานะ 0 - นั่นคือพวกเขาได้รับรหัสผ่านที่ถูกต้อง
~/.bashrc
ที่จะทำให้ถาวรนี้รวมถึงคำสั่งนามแฝงใน
โปรดทราบว่านี่เป็นวิธีที่พ่ายแพ้ได้ง่ายมาก (ตัวอย่างเช่นพวกเขาสามารถพิมพ์/bin/rm
ได้อย่างง่ายดาย
ฉันได้เขียนสคริปต์เพื่อป้องกันรหัสผ่านrm
เช่น OP ร้องขอ แต่ยังแก้ไขเพื่อป้องกันคุณจากการลบโดยไม่ตั้งใจ:
แก้ไข: 5 มีนาคม 2017 - เปลี่ยนวิธีการตรวจสอบว่าทำงานใน terminal
ใช้gksu gedit /usr/local/bin/rm
และคัดลอกในบรรทัดเหล่านี้:
#!/bin/bash
tty -s;
if [ "0" == "$?" ]; then Terminal="Y"; else Terminal="N"; fi
if [ $Terminal == "Y" ] ; then
# Running from terminal don't allow delete of / or /toplevel directory even if sudo
for i in ${@:1}
do
# Skip options -i -r -v -d
if [[ ${i:0:1} != "-" ]] ; then
# if parameter doesn't begin with '-' it's file or directory, so get real path.
fullname=$(realpath "$i" 2>&1) # No error messages if file doens't exist
# We must have at least two `/` in the full path
levels=$(echo "$fullname" | tr -cd '/' | wc -c)
if (( $levels == 1 )); then # Test for 1, will be zero when file doesn't exist.
echo "Attempting to remove top level directory '$fullname'"
echo "Use 'sudo /bin/rm $@' instead."
exit 1 # error
fi
fi
done
fi
if [[ $(id -u) != 0 ]]; then # Only non-root processes enter password (ie "sudo rm ..." is ok)
if [ $Terminal == "Y" ] ; then
# Only running from a terminal needs password (ie not cron)
# log rm usage to /var/log/syslog
PARENT_COMMAND="$(ps -o comm= $PPID)"
logger "$PARENT_COMMAND"" - rm command was used on file: ""$fullname"
# Get password
Password=$(zenity --password --title="Password for rm")
encryptPassword=$(echo -n "$Password" | md5sum)
echo "md5sum: $encryptPassword" # Comment out after viewing one time and updating line below.
if [[ "$encryptPassword" != "d2c30dc65e59558c852ea30b7338abbe -" ]]; then
echo "Invalid password!"
exit 1
fi
fi # non-terminals can't enter password.
fi # root doesn't need to enter password.
# Call REAL rm command with parameters passed to this wrapper sript
/bin/rm "$@"
exit 0
เปลี่ยนรหัสผ่าน "WE2U" เป็นทุกอย่างที่คุณต้องการและบันทึกไฟล์
rm
สคริปต์ใหม่เป็นไฟล์เรียกทำงานตั้งค่าสถานะrm
สคริปต์ใหม่เป็นไฟล์เรียกทำงานโดยใช้:
sudo chmod +x /usr/local/bin/rm
ยกเว้นว่ารหัสผ่านคือWE2Uในครั้งแรกที่คุณเรียกใช้สคริปต์คุณจะได้รับ "รหัสผ่านไม่ถูกต้อง" และรหัสการเข้ารหัสสำหรับรหัสผ่านที่คุณป้อนจะปรากฏขึ้น คัดลอกและวางคีย์การเข้ารหัสนี้จากเทอร์มินัลลงในสคริปต์ จากนั้นคอมเม้นท์บรรทัดด้วยเสียงสะท้อนที่แสดงคีย์การเข้ารหัสบนเทอร์มินัล
เนื่องจากเส้นทาง/usr/local/bin
สูงกว่าในรายการมากกว่า/bin
คำสั่งของเราrm
ถูกเรียก หลังจากได้รับรหัสผ่านที่ถูกต้องมัน/bin/rm
จะทำการลบออกจริง ๆ
ดังที่โธมัสวอร์ดชี้ให้เห็นในคำตอบอื่นถ้าคุณต้องทำsudo apt-get install ...
คุณอาจถูกขอรหัสผ่านเป็นพันครั้ง สคริปต์ตรวจสอบว่าsudo
มีการใช้งานและไม่ขอรหัสผ่านหรือไม่ นอกจากนี้หากrm
ถูกเรียกจากภายในแอปพลิเคชัน GUI ไม่จำเป็นต้องใช้รหัสผ่าน
สคริปต์ที่เรียกใช้logger
เพื่อบันทึกทุกครั้งrm
ถูกเรียกด้วยตนเองโดยใช้เทอร์มินัล /var/log/syslog
การใช้งานคำสั่งจะถูกบันทึกตาม
อีกทางเลือกหนึ่งคือการสร้างสำเนาสำรองของไฟล์สำคัญในไดเรกทอรีที่ผู้ใช้ที่ไม่ใช่รูทไม่สามารถเข้าถึงได้ คุณสามารถใช้rsync
หรือunison
ซิงโครไนซ์มันโดยอัตโนมัติเพียงแค่ให้แน่ใจว่าอย่างน้อยหนึ่งไดเรกทอรีในเส้นทางไปยังปลายทางการสำรองข้อมูลเป็นเจ้าของโดย root และโหมด 700 ซึ่งจะส่งผลให้มีไฟล์ทั้งหมดสองชุด มันจะปลอดภัยกว่าเพียงแค่สร้างผู้ใช้เป็นแขกเพื่อให้พวกเขาใช้เว้นแต่คุณจะต้องจำไว้เสมอว่าต้องล็อคหรือออกจากระบบก่อนที่จะส่งมอบคอมพิวเตอร์ให้พวกเขาหรือทิ้งไว้โดยไม่มีใครดูแล
ไม่ใช่คำตอบที่ตรงกับคำถามที่คุณกำลังมองหา แต่:
หากเพื่อนของคุณกำลังลบไฟล์ของคุณโดยใช้rm
คำสั่งแสดงว่าเพื่อนของคุณไม่มีความสามารถกระตุกกระตุกหรือเป็นเพื่อนกัน BOFHที่พยายามสอนคุณไม่ให้ออกจากการเข้าสู่ระบบและไม่ต้องสนใจ ในทุกกรณีการแก้ปัญหาคือเดียวกัน: ไม่ต้องออกจากเซสชันของคุณเข้าสู่ระบบและไม่ต้องใส่
สิ่งนี้มีข้อดีที่ไม่จำเป็นต้องจำไว้ว่าต้องทำการเปลี่ยนแปลงพิเศษกับระบบเมื่อใดก็ตามที่คุณอัพเกรดหรือรับระบบใหม่และยังป้องกันสคริปต์และสิ่งอื่น ๆ ที่คุณใช้ซึ่งขึ้นอยู่กับคำสั่งที่ทำงานตามที่คาดไว้
นอกจากนี้ยังมีข้อได้เปรียบในการหยุด "เพื่อน" จากการไปยังขั้นตอนต่อไป คุณจะต้องการ " mv
คำสั่งป้องกันรหัสผ่าน" หรือไม่หากพวกเขาตัดสินใจที่จะย้ายไฟล์ของคุณไปยัง / dev / null เมื่อพวกเขาพบว่าการลบแบบง่ายไม่ได้ทำในสิ่งที่พวกเขาต้องการ เมื่อคุณอยู่ในเกมแบบนี้การย้ายที่ชนะเพียงอย่างเดียวไม่สามารถทำได้
ฉันมีความเป็นไปได้ที่คล้ายกันซึ่งฉันวางแผนไว้ บนเซิร์ฟเวอร์ไฟล์หากหน่วยเก็บข้อมูลหลักของภาพถ่ายสามารถเขียนได้ว่าบางคนในครอบครัว (น้อยกว่าด้านเทคนิคหรือโดยบังเอิญ) อาจลบบางสิ่งบางอย่างโดยบังเอิญลาก gui ที่ย้ายไดเรกทอรีหรือเขียนทับต้นฉบับด้วยเวอร์ชันที่แก้ไขแทนที่จะเปลี่ยนชื่อ .
ฉันรู้ว่าฉันสามารถป้องกันสิ่งนั้นได้โดยไม่ให้สิทธิ์ไม่สามารถเขียนได้สำหรับทุกคน ZFS สร้างสแนปชอตเป็นระยะเพื่อให้สามารถลบหรือเขียนทับโดยไม่ตั้งใจได้ (ซึ่งแตกต่างจากการสำรองข้อมูลภาพรวมมีน้ำหนักเบาและคัดลอกเมื่อเขียนดังนั้นจึงไม่ทวีคูณการใช้พื้นที่เก็บข้อมูลของคุณ)
ZFS มีถิ่นกำเนิดใน FreeBSD Linux มี btrfs ซึ่งมีสแน็ปช็อตด้วย
วิธีแก้ปัญหาที่โง่มากสำหรับปัญหาที่โง่มาก
หากคุณไม่ต้องการchmod
rm
, rmdir
หรือmv
(สำหรับmv filename /dev/null
) หรือการใช้ ACL ของคุณสามารถสร้างผู้ใช้หุ่นที่มีรหัสผ่านไม่มีใคร แต่คุณรู้และนามแฝงแต่ละคำสั่งไปsudo [user]
แล้วทำให้นามแฝงสำหรับแต่ละคำสั่งที่เพื่อนของคุณไม่ทราบว่า . วิธีนี้เมื่อเพื่อนของคุณพิมพ์rm
ระบบจะแจ้งให้พวกเขาใส่รหัสผ่าน (แต่เดารหัสผ่านผิดจะบันทึกความพยายามที่ล้มเหลว) และคุณยังสามารถพิมพ์rmalias
หรืออะไรก็ตามที่คุณเลือกที่จะลบไฟล์จริง
หรือคุณเพียงแค่สร้างบัญชีผู้เยี่ยมชมที่ไม่มีสิทธิ์เข้าถึงโฮมไดเร็กตอรี่ของคุณ
sudo [user]
และdummy user
หากคุณต้องการป้องกัน rm รหัสผ่านโซลูชันจะทำ wrapper สำหรับrmที่ต้องการสิทธิ์รูทและขอรหัสผ่านเป็นอย่างอื่น (หมายเหตุ: wrapper นี้อาจหายไปเมื่อแพ็คเกจcoreutilsได้รับการปรับปรุงหรือติดตั้งใหม่) นอกจากนี้โปรดทราบว่านี่เป็นเพียงการรักษาความปลอดภัย rm ยังมีอีกหลายวิธีในการลบไฟล์
เปิดเทอร์มินัลและกลายเป็นรูท จากนั้นวิ่งsudo mv /bin/rm /bin/rmold
เพื่อย้ายrmเก่าไปยังที่อื่น
ตอนนี้ทำงานsudo nano /bin/rm
เพื่อสร้างเสื้อคลุม
ใน Nano ให้พิมพ์ดังต่อไปนี้:
#!/bin/bash
/bin/rmold "$@"
exit "$?"
จากนั้นCTRL
กดค้างและกดX
เพื่อออก กดY
เมื่อคุณได้รับพร้อมท์จากนั้นกดENTER
เพื่อบันทึกไฟล์
ในที่สุดเราจำเป็นต้องให้สิทธิ์ที่เหมาะสมนี้:
sudo chmod a+x /bin/rm
และคุณไป
$@
"$@"
ที่นี่สิ่งที่คุณเสนอเป็นเวอร์ชั่นดั้งเดิมที่อันตรายและปลอดภัยrm
: จะเกิดอะไรขึ้นถ้ามีไฟล์ชื่อfoo -i -r *
( -i
เพิ่มเพื่อปกป้องผู้ใช้ที่ไร้เดียงสา)?
"
-quoting $@
เป็น @xhienne แล้วฉันขอแนะนำให้คุณเตือนผู้อ่านอย่างชัดเจนว่านี่ไม่ได้ให้ความปลอดภัยเลยเนื่องจากมีหลายวิธีในการลบไฟล์ หนึ่งคือการโทรrmold
แต่มีวิธีอื่นมากมายตามที่กล่าวไว้ในคำตอบและความคิดเห็นอื่น ๆ ที่พวกเขา (ถึงอย่างนั้นนี่จะมีปัญหาที่rm
จะรู้สึกเหมือนมันลบไฟล์ในฐานะผู้ใช้ปัจจุบัน - มันถูกเรียกโดยไม่ต้องsudo
และrm
ทำงานปกติในฐานะผู้โทร - แต่จะเป็นราก! ถ้าพวกเขาเพิ่งsudo
ed พวกเขาชนะ ' ไม่แจ้งให้ทราบว่าพวกเขาอาจลบไฟล์ระบบแม้ว่าพวกเขารู้เกี่ยวกับการเปลี่ยนแปลง)