เทคนิคความปลอดภัยของบรรทัดคำสั่ง [ปิด]


34

บรรทัดคำสั่งและสคริปต์เป็นสิ่งที่อันตราย ทำตัวพิมพ์เล็ก ๆ น้อย ๆ ด้วย rm -rf และคุณตกอยู่ในโลกแห่งความเจ็บปวด สับสนแยงกับเวทีในชื่อของฐานข้อมูลในขณะที่เรียกใช้สคริปต์นำเข้าและคุณมีกระดูก (ถ้าพวกเขาอยู่บนเซิร์ฟเวอร์เดียวกันซึ่งไม่ดี แต่เกิดขึ้น) เช่นเดียวกันสำหรับการสังเกตสายเกินไปว่าชื่อเซิร์ฟเวอร์ที่คุณแชทไม่ใช่สิ่งที่คุณคิดว่ามันเป็นหลังจาก funning คำสั่งบางอย่าง คุณต้องเคารพหลุม Hawg

ฉันมีพิธีกรรมเล็ก ๆ น้อย ๆ ก่อนที่จะใช้คำสั่งที่มีความเสี่ยง - เช่นเดียวกับการทำสามครั้งตรวจสอบเซิร์ฟเวอร์ที่ฉันใช้อยู่ นี่เป็นบทความที่น่าสนใจเกี่ยวกับความปลอดภัย RM

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


3
+1 สำหรับการอ้างอิงถึง "ในจุดเริ่มต้นคือบรรทัดคำสั่ง" cryptonomicon.com/command.zip
Avery Payne

นี่ไม่ใช่คำถามของคอมมิวนิตี้หรือเปล่า จะไม่มีคำตอบเดียวที่เชื่อถือได้หรือสมบูรณ์
Bill Weiss

คำตอบ:


45

สีที่ใช้งานได้ดีคือการใช้สีพื้นหลังที่แตกต่างกันบนเชลล์ของคุณสำหรับเซิร์ฟเวอร์ prod / staging / test


6
ใช่และยังใช้สีแดงหรือสีส้มกรีดร้องที่สดใสเมื่อใดก็ตามที่คุณมีราก
Adam D'Amico

1
มีวิธีใดบ้างที่จะตั้งค่าสีของเทอร์มินัลระยะไกลโดยอัตโนมัติให้แตกต่างจากของคุณในเวลาล็อกอิน? ใช้ Gnome - นี่อาจเป็นคำถามแยกกัน
Jona

2
เพียงแค่มีคำสั่ง switch ที่เปลี่ยนตัวแปร PS1 ของคุณขึ้นอยู่กับชื่อโฮสต์ของเครื่อง
Neil

2
สำหรับผู้ใช้ Windows ทุกคนมีอัญมณีจาก Sysinternals ที่จะแสดงข้อมูลโฮสต์อย่างเด่นชัดบนวอลล์เปเปอร์ technet.microsoft.com/en-us/sysinternals/ …
squillman

ใช่ใช่ใช่ - เซสชัน iSeries ที่ใช้ในการผลิตของฉันเป็นสีขาวเป็นสีแดงเพื่อป้องกันไม่ให้ฉัน: ตัวเลือก pwrdwnsys (* IMMED) รีสตาร์ท (* YES)
Peter T. LaComb Jr.

14

เตรียมแผนสำรองเอาไว้ก่อนที่จะเริ่ม

  • บีบอัดไฟล์ / ไดเรกทอรีแทนที่จะลบทิ้งทันที
  • ตั้งค่าเราเตอร์ (ซิสโก้) ให้รีบูทในจำนวนนาที 'x' และอย่า 'wr' ทันที
  • ตรวจสอบให้แน่ใจว่าอินเทอร์เฟซที่คุณกำลังเปลี่ยนไม่ใช่ที่คุณป้อนบนระบบ นี่อาจเป็นอินเทอร์เฟซเราเตอร์ที่คุณโทรไปยังหรือพอร์ตอีเธอร์เน็ต VNC
  • ไม่เคยเข้าสู่ระบบในฐานะ 'รูต'
  • ทำการสำรองข้อมูล ตรวจสอบว่าดี ทำอีกอันหนึ่ง
  • ถามคนที่คุณไว้วางใจว่า 'ฉันกำลังจะทำอะไรที่โง่อยู่นี่?'

3
+1 cisco ios ไม่บันทึกจนกว่าจะใช้งานได้ ประณามฉันจำวัน Amiga เมื่อกล่องโต้ตอบ OS ทั้งหมดมี "ใช้", "บันทึก" และ "ยกเลิก" - โดยที่ "ใช้" จะใช้การตั้งค่าเท่านั้น แต่ไม่บันทึกไว้สำหรับการรีบูตครั้งถัดไป นั่นเป็นประโยชน์อย่างมาก!
Oskar Duveborn

ทางออกที่ดียิ่งขึ้นในวันนี้ฉันเดาว่าการเลิกทำแบบไม่ จำกัด สำหรับการเปลี่ยนแปลงระบบทั้งหมดจะเป็นวิธีที่ปลอดภัยกว่ามาก แน่นอนถ้าการตั้งค่าที่คุณเปลี่ยนทำให้ระบบเลิกใช้คุณสมบัติไม่ได้คุณจะถูกเมาอีกเลย .. hmm ^^
Oskar Duveborn

1
+1 สำหรับ "โหลดซ้ำ 5" บันทึกก้นของฉันมากกว่าสองสามครั้งเมื่อการเปลี่ยนแปลง ACL ล็อคฉันออกจากเราเตอร์ / สวิตช์ระยะไกล
394 Greg ทำงาน

+1 สำหรับจุดสุดท้าย - การตรวจสุขภาพจิต ง่ายที่จะทำแล้วอย่างน้อยคุณได้มีคนสองคนที่มีส่วนได้เสียในการแก้ไขปัญหาใด ๆ ที่เกิดขึ้น;)
แอชลีย์

10

ฉันมีวิธีแก้ปัญหาที่ใช้เทคโนโลยีต่ำในบางข้อ

ฉันได้พัฒนานิสัยที่ไม่คุ้นเคยในการทำสิ่งต่อไปนี้ (เมื่อวางแผนที่จะทำงานในฐานะรูท):

  • ก่อนเข้าสู่ระบบในฐานะผู้ใช้ปกติแล้วใช้sudo su - rootเพื่อเปลี่ยนเป็นรูท ฉันทำสิ่งนี้เป็นการเตรียมจิตใจเตือนฉันว่าฉันได้เดินเข้าไปในพื้นที่ที่อันตรายมากและฉันควรจะตื่นตัวและระวังอยู่ตลอดเวลา ตลกอย่างที่ฟังพิธีกรรมเล็ก ๆ น้อย ๆ นี้ช่วยให้ฉันเศร้าโศกเพียงแค่เสริมกำลังที่ฉันไม่สามารถประมาทได้
  • แต่ละคำสั่งถูกพิมพ์ แต่ไม่มีการกด แป้น [Return] ไม่เคย
  • ไม่มีคำสั่งใดที่ถูกดำเนินการโดยไม่เข้าใจว่ามันทำอะไร หากคุณกำลังทำสิ่งนี้โดยไม่ทราบว่าทำอะไรคุณจะเล่นรูเล็ตรัสเซียกับระบบของคุณ
  • ก่อนกดปุ่ม [Return] คำสั่งที่กระแทกกับ CLI จะถูกตรวจสอบด้วยตา หากมีข้อสงสัยใด ๆ คำใบ้ของปัญหาที่อาจเกิดขึ้นจะถูกตรวจสอบอีกครั้ง หากยังมีความลังเลอยู่คำสั่งจะคงอยู่บนบรรทัดและฉัน alt-F2 ไปยังคอนโซลอื่นเพื่อปรึกษา man pages และอื่น ๆ หากอยู่ในเซสชั่นกราฟิกฉันจะเปิดเบราว์เซอร์และทำการค้นหาบางอย่าง
  • ไม่มีผู้ใช้ทั่วไปคนใดที่จะส่งมอบsudoระบบของฉันไม่ใช่เพราะฉันเป็น BOFHแต่เนื่องจากไม่มีการเตรียมการและการฝึกอบรมนี่เป็นเหมือนการมอบปืนที่โหลดให้กับลิง ในตอนแรกมันสนุกและสนุกจนกระทั่งลิงจ้องมองบาร์เรลและบีบ ...

เมื่อใช้ rm ฉันจะcdไปยังไดเรกทอรีก่อนเสมอจากนั้นใช้คำนำหน้าของ./เพื่อให้แน่ใจว่าไดเรกทอรีนั้นถูกต้องเช่น

cd /usr/some/directory ; rm ./targetfile

หรือฉันระบุเส้นทางทั้งหมดของไฟล์

rm /usr/some/directory/targetfile

ซึ่งเป็น PITA แต่ ... ปลอดภัยกว่าขออภัย


1
ฉันให้ sudo สำหรับรายการคำสั่งที่เลือกไว้ล่วงหน้าเท่านั้นเช่น apache2 reload มิฉะนั้นผู้ใช้จะต้องผ่านฉัน มันเป็นความเจ็บปวดในก้น แต่มันเป็นการป้องกันที่ดีที่สุดสำหรับการใช้งาน devbox สำหรับ 15 คน
Artem Russakovskii

2
ข้อความอ้างอิง: "แต่เนื่องจากไม่มีการเตรียมการและฝึกอบรมนี่เป็นเหมือนการมอบปืนที่บรรจุให้ลิงมันน่าขบขันและสนุกในตอนแรกจนกระทั่งลิงมองลงไปในถังและบีบ ... " ที่จริงมันยังตลกหลังจากจุดนั้น .. ค่อนข้างยุ่ง
Mikeage

คุณควรใช้ sudo -i แทน sudo su และโดยทั่วไปแล้วการใช้ sudo เพื่อเรียกใช้คำสั่งเฉพาะนั้นปลอดภัยกว่า
LapTop006

คุณจะรันคำสั่งได้อย่างไรถ้าคุณไม่เคยกดปุ่มย้อนกลับ
กรัม

1
&& เป็นเพื่อนของคุณ! แทนที่จะทำไดเร็กทอรี cd / usr / some /; rm ./targetfile คุณควร cd / usr / some / directory && rm ./targetfile ด้วยวิธีนี้คุณจะไม่มีทางจบ rm'ing targetfile ในไดเรกทอรีดั้งเดิมของคุณถ้า cd ล้มเหลว แม้ว่าการทำเส้นทางแบบเต็มจะดีกว่า
Mike G.

10

อันนี้เฉพาะ Windows Powershell

ตามนโยบายที่เราเพิ่มดังต่อไปนี้ profile machine.ps1 ในแต่ละเซิร์ฟเวอร์ สิ่งนี้ทำให้มั่นใจได้ว่าสิ่งต่อไปนี้เป็นจริง:

  1. ผู้ดูแลระบบหน้าต่างคอนโซล PowerShell มีสีพื้นหลังสีแดงเข้ม
  2. ผู้ดูแลระบบถูกเพิ่มไปยังชื่อ
  3. ข้อความ "คำเตือน: Powershell กำลังทำงานเป็นผู้ดูแลระบบ" ถูกเขียนเมื่อเริ่มต้น
  4. แถบชื่อเรื่องจะนำหน้าด้วย "Administrator:"
  5. ยูทิลิตี้มาตรฐาน (เช่นเชลล์สคริปต์องค์กร, กลุ่มและ infozip) อยู่ในพา ธ
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ())
& {
    if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: ผู้ดูแลระบบ))
    {
        (รับเป็นเจ้าภาพ) .UI.RawUI.Backgroundcolor = "DarkRed"
        ชัดเจนเป็นเจ้าภาพ
        โฮสต์การเขียน "คำเตือน: PowerShell ทำงานเป็นผู้ดูแลระบบ"
    }

    $ Utilities = $ null
    ถ้า ([IntPtr] :: size * 8 -eq 64)
    {
        $ host.UI.RawUI.WindowTitle = "Windows PowerShell (x64)" 
        $ Utilities = "$ {env: programfiles (x86)} \ Utilities"
    }
    อื่น
    {
        $ host.UI.RawUI.WindowTitle = "Windows PowerShell (x86)"
        $ Utilities = "$ {env: programfiles} \ Utilities"
    }
    ถ้า ((ทดสอบเส้นทางยูทิลิตี้ $) - และ! ($ env: เส้นทาง - จับคู่ยูทิลิตี้ $ แทนที่ ("\", "\\")))
    {
        $ env: path = "$ Utilities; $ {env: path}"
    }
}

ฟังก์ชั่นพร้อมท์
{
    if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: ผู้ดูแลระบบ))
    {
        ถ้า (! $ host.UI.RawUI.WindowTitle.StartsWith ("ผู้ดูแลระบบ:"))
        {$ Host.UI.RawUI.WindowTitle = "ผู้ดูแลระบบ:" + $ host.UI.RawUI.WindowTitle}
    }
    'PS' + $ (ถ้า ($ nestedpromptlevel -ge 1) {'>>'}) + '>'
}

มันยอดเยี่ยม - ฉันหวังว่าคุณจะสามารถทำสิ่งนี้ได้อย่างง่ายดายใน linux กับเซิร์ฟเวอร์ทั้งหมดของคุณ
เจสันตาล

1
ใน powershell สามารถทำได้โดยแก้ไข $ pshome / profile.ps1 (โปรไฟล์เครื่องจักร) ทำไมคุณไม่สามารถทำอะไรที่เทียบเท่ากับ Linux ใน /etc/.bash_profile
Brian Reiter

2
ยังมีประโยชน์ในการเปลี่ยน $ ConfirmPreference เป็น "ปานกลาง" (ค่าเริ่มต้นเป็นสูง) และสิ่งอื่น ๆ อีกมากมายจะแจ้งให้ยืนยัน
ริชาร์ด

6

ฉันสามารถเห็นด้วยกับคำตอบทั้งหมดข้างต้น แต่ฉันต้องเน้นเคล็ดลับที่สำคัญมากนี้:

รู้ว่าเมื่อใดควรหลีกเลี่ยงการทำงานหลายภารกิจ


5

ฉันแน่ใจว่าชื่อโฮสต์ของระบบที่ฉันเปิดอยู่นั้นอยู่ในพรอมต์ bash (หรือเชลล์อื่น ๆ ) ถ้าฉันถูก chrooted ฉันต้องแน่ใจว่ามันทำให้อยู่ในนั้นด้วยเช่นกัน

ครั้งหนึ่งฉันเคยติดตั้งระบบ Gentoo จากภายในลินุกซ์ distro ที่ใช้งานอยู่อีกเครื่องหนึ่งและสั่งรันคำสั่งที่ค่อนข้างทำลายล้าง (ไม่สามารถจำได้ว่ามันคืออะไรเอทีเอ็ม - ตัวแปรบางอย่างrm) ในเชลล์ที่ไม่ถูกต้อง ลบแล้วแทนที่จะเป็นของภายใน chroot จากนั้นฉันก็ทำเสมอ

export PS1="(chroot) $PS1"

เมื่อใดก็ตามที่ฉันทำงานใน chroot


1
+1 - นอกจากนี้ฉันพบว่ามีประโยชน์ที่จะมีไดเรกทอรีการทำงานปัจจุบัน (หรือเลเยอร์ n สุดท้ายของมันหากคุณกำลังทำงานในระบบไฟล์ที่ซ้อนกันอย่างล้ำลึก) ในทันที
Murali Suriar

คู่มืออย่างเป็นทางการของ Gentoo ชี้ให้เห็นอย่างชัดเจนว่าเมื่อ chrooting จากซีดีสดไปยัง Gentoo ที่สร้างขึ้นใหม่!
cd1

CD1: ใช่ แต่คู่มือการติดตั้งอย่างรวดเร็ว x86 ( gentoo.org/doc/en/gentoo-x86-quickinstall.xml ) ไม่ได้และนั่นคือสิ่งที่ฉันใช้ในเวลานั้น แต่ตอนนี้ฉันทำมันโดยอัตโนมัติ :)
ทิม

5

มีสิ่งสำคัญที่ควรทราบก่อนทำการเปลี่ยนแปลงเซิร์ฟเวอร์:

  • ตรวจสอบให้แน่ใจว่าฉันอยู่บนเซิร์ฟเวอร์ที่ถูกต้อง

  • ระวัง ** ว่ามีกี่คนที่จะได้รับผลกระทบจากการกระทำนี้ * (ถ้าคุณทำผิดพลาดหรือไม่)

  • ก่อนที่จะพิมพ์ปุ่ม 'Enter' โปรดระวังความเป็นไปได้ที่จะยกเลิก

  • ถามตัวเองว่าคำสั่งนี้มีโอกาสที่จะยกเลิกการเชื่อมต่อเซสชันของคุณ (กฎ fw การปิดระบบไม่ดี ฯลฯ ... ) ตรวจสอบให้แน่ใจว่าคุณมีความล้มเหลวที่จะกลับมา (โดยเฉพาะถ้าคุณอยู่นอกสถานที่)


4

หากคุณยังไม่ได้ดำเนินการแทน alm rm -i


7
ไม่ไม่ไม่ไม่. นี่คือสิ่งที่แย่ที่สุดที่คุณสามารถทำได้ วันหนึ่งคุณจะพบว่าตัวเองอยู่ในกล่องที่ไม่มีนามแฝงหรือคุณทิ้งถังขยะ env ของเรา เรียนรู้การใช้ rm -i แทน
olle

ไม่ไม่ไม่ไม่. ทำสิ่งนี้ วันหนึ่งคุณจะทำสิ่งผิดพลาดและช่วยตัวเองโดยไม่ได้ตั้งใจ บ่อยครั้งกว่าที่คุณจะลืมใส่ -i ลงบนบรรทัดแล้วขันขึ้นและลบสิ่งที่ผิด
Jerub

ฉันจะไม่ทำอย่างนั้นถ้าฉันเคยทำงานกับเครื่องจักรมากกว่าหนึ่งเครื่อง ... การทำงานกับเครื่องจักรใหม่จนกว่าจะมีการตั้งค่าคือความท้าทายที่ยิ่งใหญ่
slovon

สิ่งที่แย่คือทั้ง @olle และ @Jerub นั้นถูกต้อง บางทีมันอาจจะฉลาดที่จะใส่ธงสีใน PS1 ที่ระบุ 'ความปลอดภัยปิด' / 'ความปลอดภัยบน' ...
ikso

4

กฎข้อที่ 1 - ทำการสำรองข้อมูล

กฎข้อที่ 2 - ไม่เพิ่ม "มอลลี่ยาม" ห่อคำสั่งมาตรฐานให้รุ่นของคุณเองแน่ใจ แต่ไม่ได้ใช้ชื่อนั้นมันก็จะกัดคุณเมื่อคุณอยู่ในระบบคุณไม่ได้ตั้งค่า

เคล็ดลับที่รวดเร็วเช่นสีที่แตกต่างสำหรับรูทและทรีไดเรกทอรี (บางส่วน) เป็นผู้ช่วยที่ดี แต่ให้แน่ใจว่าคุณสามารถทำงานได้โดยปราศจากพวกเขา


"มอลลี่การ์ด" คืออะไรฉันไม่เคยได้ยินคำนั้นมาก่อน
เจสันตาล


4

นี้อาจดูเหมือนเคาน์เตอร์และน้อย 'ardkore แต่ที่ดีที่สุดเคล็ดลับความปลอดภัยบรรทัดคำสั่งฉันได้เป็น: ถ้าเป็นทางเลือกโหมด GUI สามารถใช้ได้และในทางปฏิบัติแล้วใช้

ทำไม? ค่อนข้างง่าย โหมด GUI มักจะมีเครือข่ายความปลอดภัยในตัวในรูปแบบของ "คำเตือน - คุณกำลังจะโจมตี freeblefrop คุณแน่ใจหรือไม่ว่าต้องการทำเช่นนี้" แม้ว่าจะไม่ใช่มันจะทำให้คุณช้าลงทำให้มีเวลามากขึ้นในการคิด มันช่วยให้คุณตรวจสอบตัวเลือกได้ง่ายขึ้นก่อนที่จะส่งมอบคุณสามารถจับภาพหน้าจอก่อนและหลังรัฐมันปกป้องคุณจากการพิมพ์ผิด; ทุกสิ่งที่ดีมีประโยชน์และเป็นประโยชน์

ในกรณีคลาสสิกของ "rm -rf" ที่น่ากลัวคุณคิดว่ามันง่ายกว่าที่จะออกจาก GUI หรือ CLI โดยไม่ตั้งใจหรือไม่?

ในท้ายที่สุดไม่มีความละอายที่จะหันมาใช้ GUI มันจะไม่ถูกต้องป้องกันภัยพิบัติที่สำคัญ; มันเป็นไปได้ที่จะก่อให้เกิดความสุขใน GUI เช่นเดียวกับใน CLI แต่ถ้ามันช่วยคุณได้เมื่อมันพิสูจน์แล้วว่าคุ้มค่า


3

ใช้สามัญสำนึกและอย่าเรียกใช้คำสั่งที่คุณไม่เข้าใจ นั่นคือคำแนะนำที่ดีทั้งหมด หากคุณรู้สึกอยากทำตัวเองด้วยการเขียนเส้นทางที่แน่นอนของทุกสิ่งที่คุณส่งผ่านไปยัง rm หรือทำอะไรผ่าน sudo รู้สึกฟรี ฉันจะชอบซู -c อย่างน้อยก็ไม่ได้เก็บรหัสผ่านไว้ ฉันไม่สบายใจกับผู้ใช้ทั่วไปที่ได้รับอนุญาตให้ทำงานด้วยสิทธิ์พิเศษโดยไม่มีการยืนยันรหัสผ่าน

มีบางสิ่งที่คุณสามารถใส่ไว้ใน ~ / .bashrc เพื่อทำให้สิ่งต่าง ๆ ปลอดภัยขึ้นเช่น:

alias srm='rm -i'

ช่วยให้คุณมีทางเลือกที่ปลอดภัยของ rm, ...

แต่ในท้ายที่สุดคุณสามารถและจะทำให้ตกใจเสมอ เมื่อวันก่อนฉันมีสคริปต์กำหนดค่าที่หมดอายุใช้งาน chown โฟลเดอร์ / usr / bin ทั้งหมดของฉัน ใช่การ 'ติดตั้ง' แบบง่าย ๆ ของซอฟต์แวร์ทุกชนิดที่มีจุดบกพร่องอาจทำให้ระบบของคุณพัง คุณไม่ปลอดภัยไม่ว่าคุณจะทำอะไร สิ่งที่ฉันได้รับคือสิ่งที่สำคัญที่สุด:

เก็บสำรองข้อมูลปกติ


2
อีกครั้ง - อย่ามีนามแฝงว่า "rm" ในที่สุดเมื่อคุณทำงานกับระบบที่ไม่ได้ใช้นามแฝง
SilentW

มากความคิดที่ดี ถ้าคุณเคยพบว่าตัวเองบน Mac OS X (อาจแพลตฟอร์มอื่น ๆ ?) srmเป็นที่เชื่อถือได้ลบ !
morgant

3

แทนที่จะใช้นามแฝง rm ถึง rm -i จะเป็นการดีกว่าหรือไม่ที่จะให้นามแฝงพูดว่าลบหรือปลอดภัยกว่า (และใช้สิ่งเหล่านั้นเป็นเครื่องมือลบที่คุณต้องการ) จากนั้นเมื่อคุณใช้กล่องที่ไม่มีการตั้งค่านี้จะไม่มีความเสียหายเกิดขึ้น


2

ตรวจสอบให้แน่ใจว่าคุณไม่เคยเรียกใช้คำสั่งที่คุณพบออนไลน์เว้นแต่คุณจะเข้าใจอย่างถ่องแท้ว่าพวกเขากำลังทำอะไรอยู่

ระบบของคุณอาจแตกต่างจากโปสเตอร์และอาจทำให้โลกเจ็บปวด


2

สิ่งที่ชัดเจนสำหรับความปลอดภัยของบรรทัดคำสั่งจากเปอร์สเปคทีฟ Unix / Linux คือการใช้รูทบัญชีอย่างเหมาะสม
โดยทั่วไปแล้ว rm -rf ในฐานะ root มีอันตรายมากกว่าผู้ใช้และการใช้สิ่งต่าง ๆ ในตัวเช่น sudo แทนที่จะเข้าสู่ระบบในฐานะ root มีความสำคัญ whoami ง่าย ๆ ที่ดีมักจะช่วยให้ผู้ป่วยจิตเภทหรือหลายคนมีบุคลิก

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


2

การเชื่อมต่อที่สองเข้ากับเครื่องที่คุณใช้งานอาจมีประโยชน์ในกรณีที่คุณฆ่าเซสชันหลักหรือทำอะไรโง่ ๆ ที่ล็อคการทำงาน ... การประมวลผลหนัก ฯลฯ

ด้วยวิธีนี้คุณยังสามารถเข้าถึงเครื่องและสามารถฆ่าเซสชันหลักของคุณ

ความคิดเห็นข้างต้นส่วนใหญ่อ้างถึง rm แต่ฉันทำสิ่งที่โง่ด้วยคำสั่งอื่นเช่นกัน ...

ifconfig ที่จะลงเครือข่าย - ouch ที่ต้องมีสถานะทางกายภาพในการแก้ไข

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

โดยส่วนตัวฉันไม่พบพรอมต์พิเศษสำหรับสิ่งต่าง ๆ เช่น rm -i ช่วยจริงๆ ฉันทำสิ่งที่ผิดพลาดมากที่สุดเมื่อฉันเหนื่อยล้าเครียด ฯลฯ ซึ่งเป็นช่วงเวลาที่ฉันจะต่อสู้กับ y และเพิกเฉยต่อพรอมต์ บางทีการฝึกฝนที่ไม่ดี


2

หากคุณใช้ทุบตีลองสิ่งนี้:

TMOUT=600

ใน/root/.bashrcหรือคล้ายกันของคุณ มันจะนำคุณออกจากระบบโดยอัตโนมัติภายใน 10 นาทีลดโอกาสที่คุณจะพลิกไปที่รูทเทอร์มินัลที่คุณเปิดทิ้งไว้โดยไม่ตั้งใจและพิมพ์สิ่งที่โง่

ใช่ฉันรู้ว่าคุณควรใช้ sudo เพื่อรันคำสั่งรูท - นี่เป็นเพียงเครือข่ายความปลอดภัยเพิ่มเติมในกรณีที่คุณตัดสินใจที่จะเล่นมันมีความเสี่ยงในหนึ่งวัน


2
# Allow only UPDATE and DELETE statements that specify key values
alias mysql="mysql --safe-updates"`

ชื่อแทนที่แนะนำให้ใช้หากคุณเคยใช้ mysql CLI


1

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


1

ฉันหลีกเลี่ยง*glob เป็นอาร์กิวเมนต์ของตัวเองเมื่อใดก็ตามที่เป็นไปได้ แม้ว่าฉันจะหมายถึง "ลบทุกอย่างในไดเรกทอรีนี้" จริงๆฉันก็พยายามจะเจาะจงมากขึ้นเช่น rm *.php. มันคือการควบคุมความเสียหายที่ยึดเอาเสียก่อนในกรณีที่ฉันเรียกใช้คำสั่งเดิมโดยไม่ได้ตั้งใจในไดเรกทอรีอื่น


ฉันเรียนรู้ที่จะไม่ "cd dir; rm -rf *" แต่จะเสมอ "rm -rf dir" ตามที่ระบุไว้เท่าที่จะทำได้
slovon

1

วิธีที่ดีในการทำให้คุณคิดเกี่ยวกับสิ่งที่คุณทำคือเพิ่มสิ่งนี้ลงในรูตของ bashrc (cshrc อะไรก็ตาม):

unset PATH

ด้วยวิธีนี้คุณต้องทำ / bin / rm แทนที่จะเป็น "rm" ตัวละครพิเศษเหล่านั้นอาจทำให้คุณคิดว่า


ตกลงคำสั่งนี้ฉันต้องการเรียกใช้ที่ไหน which $COMMANDไม่ทำงานอีกต่อไป
Kevin M

/ usr / bin / ค้นหา $ COMMAND หรือไม่
Bill Weiss

ยิ่งไปกว่านั้น / usr / bin / ค้นหา -r / $ COMMAND $
Bill Weiss

1

สำหรับ regex ที่ซับซ้อนโดยเฉพาะคำสั่ง 'find' ให้ echo ข้างหน้าและจับไปที่ไฟล์ จากนั้นคุณสามารถตรวจสอบว่าคุณลบ / ย้าย / ฯลฯ อย่างที่คุณคิดว่าเป็นก่อนที่จะเรียกใช้งานไฟล์ด้วย 'source'

นอกจากนี้ยังมีประโยชน์สำหรับการเพิ่มกรณีขอบด้วยตนเองที่ regex ไม่ได้รับด้วยตนเอง


1

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

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

มันไม่ได้ช่วยอะไรเลยในการพิมพ์แต่ละคำสั่งเหล่านี้อย่างอิสระ

$ ls *.bak
$ echo rm *.bak
$ rm * .bak

... เพราะฉันพิมพ์ช่องว่างในบรรทัดสุดท้ายโดยไม่ได้ตั้งใจและลบไฟล์ทั้งหมด ฉันมักจะเรียกบรรทัดก่อนหน้านี้และเพียงแค่ลบ 'echo'


1

ผู้ใช้รูท:
อย่าเป็นรูทเว้นแต่คุณจะต้อง
หากผู้ขายบอกว่าจำเป็นต้องเรียกใช้ในฐานะรูทบอกพวกเขาว่าคุณคือลูกค้าและคุณต้องการเรียกใช้ในฐานะที่ไม่ใช่รูท
มีซอฟต์แวร์แพ็กเกจจำนวนเท่าไรที่ต้องการให้รูท 'เพราะง่ายกว่า'?

นิสัย:
ไม่เคยใช้ '*' ด้วยการลบโดยไม่ต้องมองมันสามครั้งวิธีที่ดีที่สุดคือสร้างนิสัยในการใช้ ls -l TargetPatternจากนั้นใช้ 'rm! $' ภัยคุกคามที่ใหญ่ที่สุดไม่ได้อยู่ในที่ที่คุณคิดว่าคุณเป็น ฉันเกือบพิมพ์ 'ชื่อโฮสต์' บ่อยเท่า 'ls'!

crutches:
พรอมต์มาตรฐานช่วยได้มากเช่นเดียวกับนามแฝงเช่น "alias rm = 'rm -i'" แต่ฉันมักจะไม่สามารถควบคุมเครื่องจักรที่ฉันใช้งานได้อย่างเต็มที่ดังนั้นฉันจึงใช้สคริปต์ wrapper ที่คาดหวังเพียงเพื่อกำหนดเส้นทางของคุณ , พรอมต์และชื่อแทนด้วย '-i'

ค้นหาปัญหา: การ
ใช้เส้นทางแบบเต็มช่วย แต่ในกรณีที่เป็นไปไม่ได้ให้ทำซีดีลงในตำแหน่งที่ปลอดภัยกว่าและใช้ '&&' เพื่อให้มั่นใจว่า 'ซีดี' สำเร็จก่อนที่คุณจะค้นหาเอาออกทา ฯลฯ :
ตัวอย่าง: การcd /filesystema && tar cf - | ( cd /filesystemb && tar vxf -)
ใช้ '&&' สามารถป้องกันไม่ให้ไฟล์ tar ถูกแยกไว้ด้านบนของตัวเองในกรณีนี้ (แม้ว่าในกรณีนี้ 'rsync' จะดีกว่า)

removees:
อย่าลบ recursively หากคุณสามารถช่วยได้โดยเฉพาะในสคริปต์ ค้นหาและลบด้วย -type f และ -name 'pattern' ฉันยังมีชีวิตอยู่ในความกลัวที่จะให้อาหาร 'to' xargs ... tar และ untar เพื่อย้ายสิ่งต่าง ๆ (ใช้ rsync แทน)


1

ถ้าคุณใช้หลายสายพันธุ์ของระบบปฏิบัติการที่เป็นมากตระหนักถึงความแตกต่างในไวยากรณ์; สิ่งที่มีความปลอดภัยพอสมควรในตัวแปรหนึ่ง unix นั้นเป็นอันตรายอย่างยิ่งในอีกอันหนึ่ง

ตัวอย่าง: killall

Linux / FreeBSD / OSX - ฆ่ากระบวนการทั้งหมดที่ตรงกับพารามิเตอร์ที่ส่งผ่าน เช่น: "killall apache" ฆ่าอาปาเช่ทั้งหมดออกจากกระบวนการอื่นทั้งหมดเพียงอย่างเดียว

Solaris - ฆ่ากระบวนการทั้งหมด ไม่มีจริงๆ. จากหน้า man : killall ถูกใช้โดยการปิด (1M) เพื่อฆ่ากระบวนการที่ใช้งานอยู่ทั้งหมดที่ไม่เกี่ยวข้องโดยตรงกับขั้นตอนการปิดระบบ


ฉันได้เรียนรู้ว่าหนึ่งในเซิร์ฟเวอร์สำรองของนายจ้างก่อนหน้านี้ ในขณะที่มันกำลังทำงานเทปคืน โอ๊ย.
Bill Weiss

1
คุณสามารถใช้ pkill แทนที่ทำงานบนโซลาริสและลินุกซ์
เจสันตาล

0

แทน

rm foo*

ใช้

rm -i foo*

มันใช้งานได้จริงกับไฟล์จำนวนหนึ่ง แต่ไม่ใช่กับ tarball ทั้งหมด นั่นเป็นเหตุผลว่าทำไมนามแฝงrmจะเข้ามาขวางคุณ


นั่นคือสิ่งที่สวิตช์ -f ใช้สำหรับ: การแทนที่สวิตช์ -i ก่อนหน้านี้ หากคุณใส่สิ่งนี้ลงใน. bash_profile หรือสคริปต์การเริ่มต้นเชลล์ที่คล้ายกันคุณจะไม่ต้องกังวลกับมัน เพียงให้แน่ใจว่าคุณต้องการที่จะทำ แต่มันก็บอกว่ามาก่อนและพูดจาฉะฉานมากขึ้น
Kevin M

0

การรันคำสั่งด้วย echo ก่อนเป็นความคิดที่ดี แต่ก็ยังมีแนวโน้มที่จะพิมพ์ผิด

ลองใช้กับส่วนขยายเช่น! $

echo foo*
rm -rf !$

! $ ขยายไปเป็นคำสุดท้ายของคำสั่งสุดท้ายดังนั้นจึงเท่ากับ

echo foo*
rm -rf foo*

นอกจากนี้ยังมี! * ซึ่งขยายไปยังอาร์กิวเมนต์ทั้งหมดไปยังคำสั่งสุดท้าย

แน่นอนคุณสามารถทำได้ด้วยวิธีนี้หากคุณต้องการ

echo rm -rf foo*
!*

(หากคุณใช้ ksh ไม่ใช่ bash คุณสามารถพิมพ์ Esc + period เพื่อแทรกคำสุดท้ายแทน)


Esc + ทำงานในทุบตีเกินไป
olle

0

ในกรณีของสิ่งที่ชอบ:

ls * .php
echo rm * .php
rm * .php

คุณสามารถใช้โอเปอเรเตอร์การทดแทนเช่นนี้ได้:
$ ls * .php
<dir listing>

$ ^ ls ^ echo rm (สิ่งนี้แทนที่ ls ในคำสั่งก่อนหน้าด้วย echo rm ทำให้บรรทัดคำสั่งที่เหลือเหมือนเดิม)

$ ^ echo rm ^ rm (แทนที่ echo rm ด้วย just rm ดังนั้นคุณไม่ต้องพิมพ์ * .php อีกครั้งและโยนลงในช่องว่างในเวลาที่ไม่ถูกต้อง)

^ = shift-6 สำหรับผู้ที่ไม่คุ้นเคย


ick ฉันควรใช้ปุ่มลูกศรและแก้ไขบรรทัดก่อนหน้า ด้วยวิธีนี้ฉันจะเห็นว่าคำสั่งใดกำลังจะทำงานเมื่อฉันกด Enter แทนที่จะเชื่อใจตัวเองว่าสุ่มเพื่อให้ได้รูปแบบการทดแทนที่ถูกต้อง
Marius Gedminas

ตัวอย่างเช่นหลังจาก "echo rm * .php" คุณทำ <Up><Home> <Alt-D> จากนั้น <Enter>
Marius Gedminas

0

ใช้ bash และตั้งค่า PS1 = '\ u @ \ h: \ w>' สิ่งนี้จะขยายไปยังชื่อผู้ใช้ @ hostname: / full / working / directory / path> ดังที่กล่าวไว้ในคำตอบอื่น ๆ คุณสามารถใช้ความคาดหวังในการตั้งค่าสภาพแวดล้อมทุกครั้งที่คุณเข้าสู่ระบบหากคุณไม่สามารถอัปเดตไฟล์. profile หรือ. bash_profile การเปลี่ยนสีพื้นหลังเป็นคำตอบที่ง่ายที่สุดแม้ว่า :-)


-1

อ่าใช่ เคล็ดลับเก่าแก่ในการส่งไฟล์ให้กับ IRC ชื่อ "-rf" เพื่อให้มันจบลงในไดเรกทอรี ~ ของพวกเขา หนึ่ง "rm -rf" หนึ่งน้อยในภายหลัง (แทนที่จะเป็น "rm - -rf") และเสียงหัวเราะมากมายเกิดขึ้นเมื่อพวกเขาเรียนรู้บทเรียนที่โหดร้ายเกี่ยวกับการไม่ใช้ IRC เป็นราก


+1 สำหรับปัจจัย rofl
David Z

ดังนั้น "rm -rf" ควรจะทำร้ายคุณใช่มั้ย
kubanczyk

อาจเป็นชื่อไฟล์จริง ๆ "-rf *"?
Marius Gedminas

-1

แทนที่จะใช้rm -rf <dir>ใส่-rfท้ายที่สุดเช่น: rm <dir> -rf. คิดว่าเป็นการลบความปลอดภัยหลังจากที่คุณได้เล็งและก่อนที่คุณจะยิง ด้วยวิธีนี้คุณจะได้รับการปกป้องถ้าคุณมีคีย์ป้อนในขณะที่พิมพ์ชื่อไดเรกทอรี (หรือใช้การทำให้แท็บสมบูรณ์) และมีไดเรกทอรีที่มีชื่อคล้ายกัน

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