แนวปฏิบัติที่เหมาะสมที่สุดสำหรับนามแฝงคำสั่ง rm และทำให้ปลอดภัยยิ่งขึ้น


21

บางเวลาที่ผ่านมาฉันลบโฟลเดอร์ในบ้านของฉันอย่างผิดพลาดเพราะฉันวิ่งrm -rf *บนเทอร์มินัลที่ไม่ถูกต้องซึ่งไดเรกทอรีการทำงานคือโฟลเดอร์บ้าน!

ฉันหวังว่าฉันจะมีนามแฝงสำหรับrmคำสั่ง แต่มันไม่ใช่กรณี

rmตอนนี้ผมกำลังวางแผนที่จะทำให้สคริปต์เป็นชื่อแทนสำหรับ

คุณมีแนวทางปฏิบัติที่ดีที่สุดที่จะแนะนำหรือไม่?

ขอบคุณ


7
ไม่ใช่ว่าฉันไม่มีความเห็นอกเห็นใจ แต่ฉันไม่คิดว่าrmเป็นคำสั่งที่อันตรายที่ต้องใช้นามแฝงเพื่อความปลอดภัย โดยการใช้rและfตัวเลือกที่คุณบอกเปลือกฉันรู้ว่านี้เป็นสิ่งที่อันตรายและฉันคิดอย่างรอบคอบเกี่ยวกับมันและมัน _really_ สิ่งที่ฉันต้องการจะทำ หากคุณไม่ได้ใช้ตัวเลือกเหล่านี้คุณจะไม่สามารถลบโฟลเดอร์หลักทั้งหมดได้
user26512

คำถามนี้ครอบคลุมข้อมูลเดียวกันกับstackoverflow.com/questions/373156/หรือไม่?
เดวิดแฮร์ริส

1
@grossvogel ไม่มีความผิด :) อย่างไรก็ตามการใช้นามแฝงคำสั่งนี้เป็นวิธีปฏิบัติทั่วไป ผู้คนจำนวนมากใช้ตัวเลือก -f เพื่อหลีกเลี่ยงการยืนยันการลบแต่ละครั้ง

23
โปรดทราบว่าถ้าคุณใช้นามแฝงสำหรับrmคุณจะได้ใช้ชื่อแทนนั้น จากนั้นวันหนึ่งคุณจะเข้าสู่ระบบที่ไม่มีนามแฝงอยู่และคุณจะทำสิ่งผิดเมื่อคุณคาดหวังน้อยที่สุด และมันอาจจะไม่ใช่ระบบของคุณ
Stefan Lasiewski

2
@puller เฉพาะในระบบเช่น RHEL ว่านามแฝงโง่ไปrm rm -i
Daniel Beck

คำตอบ:


30

ถ้าคุณต้องการที่กำหนดเองrm, ไม่ได้เรียกว่าrmแต่ชื่อของเธอให้myrm, deleteหรืออะไรก็ตาม

rm='rm -i'นามแฝงเป็นหนังสยองขวัญเพราะหลังจากที่ในขณะที่ใช้มันคุณจะคาดหวังrmที่จะแจ้งให้คุณโดยค่าเริ่มต้นก่อนที่จะลบไฟล์ แน่นอนว่าวันหนึ่งคุณจะเปิดใช้งานด้วยบัญชีที่ยังไม่ได้ตั้งชื่อแทนและก่อนที่คุณจะเข้าใจว่าเกิดอะไรขึ้นมันก็สายเกินไป

ไม่ว่าในกรณีใดวิธีที่ดีในการเตรียมพร้อมสำหรับการสูญหายของไฟล์หรือความเสียหายคือการสำรองข้อมูล

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


3
ฉันเคยได้ยินเรื่องสยองขวัญที่เป็นการส่วนตัวจากหนึ่งในผู้ที่ประสบมัน
Dan D.

ฉันเห็นด้วย แต่คนส่วนใหญ่ไม่ได้มีเสรีภาพที่จะเปลี่ยนไปใช้ระบบไฟล์ที่แตกต่างกันโดยสิ้นเชิง
Peon

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

12

หากคุณต้องการบันทึกนามแฝง แต่ไม่ต้องการเสี่ยงที่จะคุ้นเคยกับคำสั่งที่ทำงานแตกต่างจากระบบของคุณมากกว่าคนอื่น ๆ คุณสามารถปิดการใช้งานrmเช่นนี้ได้

alias rm='echo "rm is disabled, use remove or trash or /bin/rm instead."'

จากนั้นคุณสามารถสร้างนามแฝงที่ปลอดภัยของคุณเองเช่น

alias remove='/bin/rm -irv'

หรือใช้trashแทน


2
โปรดทราบว่า (อย่างน้อยในบางเวอร์ชัน) คุณต้องกำหนดชื่อแทนตามลำดับอื่น ๆ ทำในลำดับที่คุณปัจจุบันกำหนดเป็นremove echo "rm is disabled, use trash or /bin/rm instead." -irvและเช่นเดียวกับสามัญสำนึกคุณไม่ต้องการให้ข้อความrmอ้างอิงถึงremoveคำสั่งที่ปลอดภัยของคุณหรือไม่?
Scott

คุณพูดถูกฉันจะอัปเดตคำตอบตามนั้น
Dario Seidl

5

คุณสามารถลองใช้trashแทน เพียงจำไว้ว่าให้ล้างมันเป็นครั้งคราว ...


3

โดยไม่ต้องเปลี่ยนโปรไฟล์ everyones สิ่งที่คุณสามารถทำได้คือวางไฟล์ชื่อ -i ในไดเรกทอรี

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 

จะไม่ทำงานหากผู้ใช้ตัดสินใจที่จะใช้ * * แทนที่จะเป็นเพียง * แต่ก็ยังมีเล่ห์เหลี่ยม
Peon

1
afaik rm -rf หรือ rm -rf .. ไม่สามารถประสบความสำเร็จเพราะคุณอยู่ในไดเรกทอรี
Peon

@Peon: ฉันเชื่อว่าคุณหมายถึง.* *มากกว่า* .*(ซึ่งฉันเชื่อว่าเป็นเรื่องธรรมดา) หรือ* . *(ซึ่งคุณพูด) …………………………………………………ทุก…………ทุก…………………ทุกเทคนิคนี้ต้องมีประสิทธิภาพทั่วโลกอย่างแท้จริงคุณต้องทำในทุกไดเรกทอรีที่คุณได้รับอนุญาตให้เขียน . แต่ฉันเห็นด้วยมันเป็นเคล็ดลับที่เรียบร้อย
Scott

1

ฉันใช้สคริปต์ต่อไปนี้

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

หากคุณเผลอลบไฟล์, $HOME/tmpการกู้คืนจาก

สคริปต์จะย้ายไฟล์ที่ถูกลบไปยังtmpไดเรกทอรีและลบออกในครั้งต่อไปที่สคริปต์ลบจะทำงานหากเวลาการเข้าถึงคือ 7 วันต่อมา (การทำความสะอาด$HOME/tmpไดเรกทอรีแบบกึ่งอัตโนมัติ)


-2

ในโปรไฟล์ของคุณ

alias rm="rm -i"

3
นามแฝงของฉันคือในความคิดของฉันค่อนข้างคำแนะนำที่ไม่ดีและมันจะไม่ช่วยในกรณีของ puller
jlliagre

rm -Iให้สิ่งที่ดีที่สุดทั้งสองโลก @jlliagre
Tamara Wijsman

@Tom Wijsman บางส่วนแน่นอน การเปลี่ยนพฤติกรรมของคำสั่ง Unix มาตรฐานที่สำคัญยังคงมีความเสี่ยงที่นี่ หากคุณต้องการให้เป็นแบบโต้ตอบให้ตั้งชื่อแทนอื่นให้
jlliagre

@jlliagre: อืมดังนั้นคุณหมายความว่าสคริปต์จะตรวจจับการเปลี่ยนแปลงนี้หรือไม่
Tamara Wijsman

โปรดอ่านคำตอบของฉันsuperuser.com/a/382498/19279เพื่อรับคะแนนของฉัน
jlliagre

-2

สคริปต์ที่เรียกว่ามีเนื้อหาdmv $* /tmp

แก้ไข: นี่เป็นความคิดที่ไม่ดี; ดูด้านล่าง ฉันมีalias d='mv -t /tmp'อยู่ในปัจจุบันของฉัน.profileแทน


2
คำแนะนำนี้เป็นอันตรายและอาจ a) แทนที่ไฟล์ที่อยู่ในถังขยะแล้วด้วยชื่อเดียวกันหรือ b) ลบไฟล์ผิดทั้งหมด ( d "foo bar"จะลบไฟล์fooและbar) สิ่งที่ปลอดภัยกว่าอาจเป็นไปได้#!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempและmvไวยากรณ์ขึ้นอยู่กับระบบของคุณสิ่งนี้ใช้ได้กับ Linux)
Daniel Beck

2
ขอบคุณสำหรับคำอธิบาย ฉันสบายดีที่มีปัญหาก) แต่ปัญหาข) เป็นปัญหาใหญ่ ฉันเปลี่ยนdคำสั่งalias d='mv -t /tmp'ของฉันเป็นของฉัน.profile; ฉันคิดว่านั่นเป็นวิธีง่ายๆที่ฉันกำลังมองหา
beefus

-2

รหัสทุบตีนี้เพิ่มฟังก์ชันrmลงใน~/.bash_profileไฟล์กำหนดค่าของคุณ หลังจากเรียกใช้งานสิ่งนี้หากคุณเขียนrm fileคุณจะย้ายไฟล์นั้นไปที่/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF

1
สคริปต์ / รหัสนี้ทำอะไร โปรดอธิบายเพื่อให้ผู้ใช้ด้านเทคนิคน้อยเข้าใจคำตอบของคุณ
Vylix

2
แม้ว่าสิ่งนี้อาจตอบคำถามได้ แต่มันจะเป็นคำตอบที่ดีกว่าถ้าคุณสามารถให้คำอธิบายได้ว่าทำไมถึงเป็นเช่นนั้น
DavidPostill

1
นี่เป็นคำตอบสำหรับคำถาม แต่เป็นคำถามที่แย่มาก มีการโพสต์คำตอบนี้สองเวอร์ชันที่ดีขึ้นแล้ว
สกอตต์

รหัสทุบตีนี้เพิ่มฟังก์ชันrmลงใน~/.bash_profileไฟล์กำหนดค่าของคุณ หลังจากที่รันไฟล์นี้ถ้าคุณเขียนคุณจะย้ายไฟล์นั้นไปยังrm file /tmp
Vicente Gonzalez

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