วิธีปิดการใช้งานคำสั่งเทอร์มินัลที่น่ากลัว?


82

คุณปิดการใช้งานคำสั่งเทอร์มินัลที่น่ากลัวได้อย่างไร?

ฉันใช้ SSH เพื่อเข้าถึงเซิร์ฟเวอร์ Ubuntu ระยะไกลโดยไม่ต้องเข้าถึงเซิร์ฟเวอร์จริง ฉันคิดว่าฉันพิมพ์ ' shutdown' ลงในเซิร์ฟเวอร์ NoSQL ที่ทำงานบน Ubuntu OS แต่จริงๆแล้วฉันบอกเซิร์ฟเวอร์ Ubuntu ว่าจะปิดเครื่อง จากนั้นฉันต้องบอกผู้ดูแลเซิร์ฟเวอร์ว่าฉันทำอะไรเพื่อที่เขาจะได้เริ่มต้นเซิร์ฟเวอร์จริงสำหรับฉัน นั่นน่าอาย!

ฉันจะป้องกันไม่ให้สิ่งนี้เกิดขึ้นอีกได้อย่างไร


100
นี้ได้รับการกล่าวถึงในความยาวมักจะมีความสัมพันธ์กับการที่มีผลข้างเคียงที่เลวร้ายยิ่งกว่าrm shutdownที่บรรทัดด้านล่าง: นี่คือวิธีที่จะป้องกันไม่ให้สิ่งเลวร้ายเกิดขึ้นหากคุณยังคงเรียกใช้คำสั่งแบบสุ่มเป็นราก
Dmitry Grigoryev

5
ดังที่คนอื่น ๆ ตั้งข้อสังเกตเกี่ยวกับนามแฝงการทำเช่นนี้สามารถทำให้ผู้คน "ติดนิสัยของคำสั่งที่ทำงานในลักษณะที่ไม่ได้มาตรฐาน" ดังนั้นดูเหมือนว่าจะไม่ดีกับคนอื่น ๆ ที่เซิร์ฟเวอร์ NoSQL โง่ใช้คำสั่งนี้หรือไม่?
bmb

เซิร์ฟเวอร์ NoSQL ที่ฉันใช้คือ Redis
MelodiousFires

60
เพียงไม่ทำงานภายใต้บัญชีรูท
alk

12
ฉันกล้าพูดว่าคุณเรียนรู้บทเรียนดังนั้นคุณไม่จำเป็นต้องปิดการใช้งานคำสั่งใด ๆ อีก ฉันจะเพิ่มคุณด้วยอย่าโง่ GNU / Linux คุณเพิ่งเก่งกว่าคนโง่

คำตอบ:


204

คำตอบมาตรฐานคือ "ไม่เข้าสู่ระบบในฐานะ root" คำสั่งทั้งหมดทำงานเป็นรูทที่น่ากลัว หากนั่นไม่ใช่ตัวเลือกคุณสามารถใส่คำสั่ง alias บางคำลงในของคุณ.bashrcเพื่อปิดคำสั่งที่คุณพบว่าน่ากลัวเป็นพิเศษ ตัวอย่างเช่น:

for scary in shutdown halt  reboot rm
do
    alias $scary="echo If you really want to do that, type: `which $scary`"
done

จากนั้นหากคุณพิมพ์การปิดระบบคุณจะได้รับข้อความต่อไปนี้:

If you really want to do that, type: /sbin/shutdown

( ตรวจสอบให้แน่ใจว่าคุณ.bashrcโหลดก่อนที่คุณจะลองบนเซิร์ฟเวอร์ที่ใช้งานจริง)

ออกจากsshเซสชันปัจจุบันของคุณและเข้าสู่ระบบอีกครั้งหรือใช้. ~/.bashrcควรโหลด / รัน. bashrc อาจลองเรียกใช้rmโดยไม่มีข้อโต้แย้งใด ๆ เพื่อให้แน่ใจว่าเซิร์ฟเวอร์ของคุณไม่ได้ปิดการใช้งานโดยอัตโนมัติ.bashrcในการเข้าสู่ระบบหรือคล้ายกัน

โปรดทราบว่าหากคุณมีความกังวลเกี่ยวกับการหยุดและปิดเครื่องเป็นหลักคุณสามารถพิจารณาติดตั้งmolly-guardซึ่งจะทำให้คุณพิมพ์ชื่อโฮสต์ก่อนที่จะปิดเครื่อง สิ่งนี้มีประโยชน์มากขึ้นถ้าคุณปิดระบบปฏิบัติการทั้งระบบเป็นประจำใน commandline แต่ต้องการให้แน่ใจว่าคุณปิดระบบที่ถูกต้อง

คุณสามารถลองทดสอบด้วยคำสั่งที่น่ากลัวน้อยกว่าเช่นออกจากระบบหรือออกจากระบบ


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

145
การใช้นามแฝง "น่ากลัว" คำสั่งให้มีพฤติกรรม "ปลอดภัย" คือจากประสบการณ์ของฉันความคิดที่ไม่ดี นี่เป็นเพราะคนมักจะมีนิสัยสั่งการทำงานในลักษณะที่ไม่ได้มาตรฐานซึ่งสามารถทำให้พวกเขาทำสิ่งที่น่าเศร้าเมื่อพวกเขาอยู่ในระบบวานิลลา คำตอบง่ายๆคือการเหยียบอย่างระมัดระวังมากเมื่อเข้าสู่ระบบในฐานะที่เป็นราก
TimGJ

22
@isanae ทางลัดที่ฉันใช้เพื่อเปิดเทอร์มินัลโดยใช้ ssh ไปยังเซิร์ฟเวอร์ที่ใช้งานจริงจะทำให้พื้นหลังเทอร์มินัลเป็นสีแดง นั่นทำให้ฉันสนใจ
Peter A. Schneider

6
sourceเป็นชื่อแทน.และเชลล์ไม่สนับสนุนทั้งหมด
gronostaj

4
โปรดทราบว่าในขณะที่ Debian และโดยส่วนขยาย Ubuntu มี~/.bash_profileแหล่งข้อมูลเริ่มต้น.bashrcซึ่งไม่ใช่พฤติกรรมมาตรฐานและในระบบส่วนใหญ่.bashrcจะไม่อ่านเมื่อทำการล็อกอินผ่าน ssh ดังนั้นสิ่งนี้จะไม่สร้างความแตกต่าง เป็นการดีกว่าที่จะเพิ่มชื่อแทนลงใน~/.profileหรือ~/.bash_profileแทน
terdon

73

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

ต้องบอกว่าไม่ต้องโง่ที่ใช้sudoสำหรับทุกอย่าง ทำความเข้าใจกับสิ่งที่คุณทำและทำความเข้าใจว่าเพราะอะไร / ไม่ต้องการสิทธิ์พิเศษ


นอกจากนี้คุณสามารถแยกแยะพรอมต์ของคุณสำหรับรูท / เชลล์ผู้ใช้ สิ่งนี้ยังทำให้เห็นได้ชัดว่าคุณกลับมาที่ shell prompt ไม่ใช่ " CLI อื่น " Mine มีสีสันมากและมีข้อมูลที่เป็นประโยชน์มากมาย (เช่นชื่อโฮสต์) ซึ่งทำให้ง่ายมากที่จะทราบว่าคำสั่งโฮสต์จะทำงานอย่างไรและยังช่วยให้มองย้อนกลับไปในประวัติศาสตร์ของคุณและค้นหาพรอมต์ได้ง่ายขึ้น เชลล์ใช้พรอมต์เริ่มต้น

PS1 ของฉัน

วิธีนี้เหมาะสมกว่าที่จะใช้กับบัญชี " ของคุณ " แต่ถ้าคุณใช้ความปลอดภัย / ดูแลระบบอย่างจริงจังคุณจะไม่แชร์รหัสผ่าน / บัญชีและคุณจะไม่ได้อยู่ในรูทเชลล์โดยไม่ต้องรับรู้อย่างเต็มที่


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



2
เขาจะไม่เจอปัญหาแบบเดียวกันกับsudo shutdownเหรอ? หากเขาเรียกใช้งานบนเครื่องที่ไม่ถูกต้อง
Barmar

2
@Barmar NoSQL เข้าใจคำสั่ง sudo หรือไม่
Taemyr

2
@Taemyr sudoเป็นคำสั่งเชลล์มันไม่มีอะไรเกี่ยวข้องกับฐานข้อมูล
Barmar

4
@Barmar: อันที่จริงฉันคิดว่า OP หมายถึงพิมพ์ลงในโปรแกรม NoSQL cmdline ไม่ใช่การทุบตี ดังนั้นพวกเขาจะไม่พิมพ์sudo shutdownเพราะฉันถือว่าsudoไม่ใช่คำสั่ง NoSQL การไม่ได้อยู่ในรูทเชลล์จะแก้ปัญหาทั้งหมดได้และเป็นความคิดที่ดีมาก ดังนั้นจะดูที่พรอมต์อย่างรอบคอบก่อนที่จะใช้คำสั่งที่สำคัญ
Peter Cordes

44

แพ็คเกจ 'molly-guard' (อย่างน้อยในระบบ Debian ที่ได้รับ) จะทำการติดตั้ง wrapper รอบ ๆ การปิด, หยุด, poweroff และรีบูต หากตรวจพบว่าเทอร์มินัลนั้นเป็นรีโมตแล้วจะแจ้งชื่อโฮสต์ หากไม่ตรงกันคำสั่งจะถูกยกเลิก


4
สิ่งที่เกี่ยวกับคนอื่น ๆ (น่ากลัวกว่าเนื้อหา) เช่นrm -rf /อะไร?
marcellothearcane

9
@marcellothearcane อาจจะช่วยให้มีการว่าในบางกรณีเช่นเมื่อเขียนset -u rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT
Alex Hall

4
@marcellothearcane ในทุกสิ่งที่คล้ายกับระบบลีนุกซ์ที่ทันสมัย--no-preserve-rootซึ่งต้องการสิ่งที่คุณไม่น่าจะพิมพ์โดยไม่ได้ตั้งใจ
CVn

3
ใครคือมอลลี่ฉันสงสัย ... อาจเป็นแมวของใครบางคน
the0ther

7
@ the0ther เด็กอายุ 2 ขวบที่เปิดสวิตช์ SCRAM บนเครื่องไดโนเสาร์สองครั้งในวันเดียวกัน พวกเขาอยู่ในห้องหัวเลี้ยวฝาปิดสวิตช์ catb.org/jargon/html/M/molly-guard.html
CSM

4

ฉันยอมรับคำตอบที่ฉันชอบมาก แต่ถ้าใครอ่านและต้องการคำตอบที่ง่ายกว่านี่คือของฉัน

ค้นหาไฟล์. bashrc และวางเป็นบรรทัดสุดท้าย:

alias shutdown=notforuse

จากนั้นเมื่อคุณพิมพ์การปิดคุณจะได้รับสิ่งที่ชอบ ~bash: notforuse is not a command

นี่อาจจะงี่เง่า แต่ก็ง่ายและใช้งานได้ ฉันขอขอบคุณคำตอบด้วยวิธีที่ดีกว่าในการทำเช่นนี้!


4
หืมฉันเคยทำสิ่งนี้rmเพื่อหลอกล่อผู้คน -alias rm='echo "You can't use rm!" #'
MD XF

52
ฉันคิดว่านี่เป็นความคิดที่ไม่ดีด้วยเหตุผลสามประการ อย่างแรกมันสับสนสำหรับใครก็ตามที่มีสิทธิ์เข้าถึงเครื่อง ประการที่สองมันฝึกให้คุณรู้ว่ามันเป็นเรื่องปกติที่จะพิมพ์ "shutdown" และกด enter ซึ่งหมายความว่าคุณมีแนวโน้มที่จะทำผิดพลาดเหมือนกันในระบบถัดไปที่คุณสามารถเข้าถึงรูทได้ ประการที่สามสิ่งนี้จะกลายเป็นความสับสนอย่างยิ่งหากมีคำสั่งที่ถูกต้องเรียกว่าnotforuseบนเส้นทาง
David Richerby

5
ฉันอยู่กับ @DavidRicherby ในรายการนี้ ไม่ใช่ความคิดที่ดี
Tico

ถ้าคุณอยากจะใช้นามแฝงอย่างน้อยคุณสามารถใส่ทุกคนกลัวคำสั่งนามแฝงในแฟ้มให้เราพูด~/.SaveMyReputationและเพิ่มบรรทัดสุดท้ายของคุณสายเป็น.bashrc [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputationในที่สุดคุณอาจต้องการเพิ่มบรรทัดพิเศษecho "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"ภายในไฟล์นั้น อย่างน้อยคุณอาจนำไฟล์นามแฝงนี้ไปให้กับเครื่องอื่น ๆ (ควรเป็น.bash_aliasesเช่นนั้น แต่ในกรณีที่"คัดค้าน"ควรใช้ชื่ออื่นแทน)
Hastur

alias shutdown=shutdown-disabled-by-an-aliasหากคุณกำลังจะทำเช่นนี้จะทำให้เกิดความสับสนน้อยลงโดยใช้ชื่อเหมือน (นี่เป็นเพียงการระบุปัญหาที่ 3 และปัญหาเล็กน้อยที่สุดที่ @DavidRicherby ชี้ให้เห็น) แม้ว่ามันจะยังคงใช้เวลาเพียง 2 วินาทีสำหรับบุคคลต่อไปที่จะไม่เห็นnotforuse is not a commandการทำงานtype -a shutdownและการค้นหานามแฝงจากนั้นพิมพ์sudo \shutdownเพื่อปิดใช้งานการขยายนามแฝง (สมมติว่าพวกเขามีsudoนามแฝงsudo='sudo 'เพื่อขยายชื่อแทนใน ARG แรก)
Peter Cordes

1

สำหรับshutdown( reboot, haltและที่เกี่ยวข้อง): ผมมีสำเนากับถามฉันว่าฉันแน่ใจว่าจริงๆ (และก็ไม่ได้ทำอะไรอยู่แล้วบริการ) /usr/local/sbinฉันเก็บสคริปต์ดังกล่าวในใน บนเดเบียนนี้มีลำดับความสำคัญอื่น ๆ/sbin(เป็นไดเรกทอรีแรกของ PATH)

สคริปต์ของระบบใช้เส้นทางแบบเต็มดังนั้นการแฮ็กดังกล่าวป้องกันไม่ให้ฉันหยุดเซิร์ฟเวอร์ระยะไกลแทนเครื่องในระบบ (พฤติกรรมที่ไม่ดีจากAwesome WM) แต่ไม่มีผลทางอ้อมอื่น ๆ และฉันยังสามารถใช้พวกเขาเป็น / sbin / shutdown เมื่อต้องการจริงๆ .


แฮ็กดังกล่าวจะทำงานเฉพาะถ้าคุณนำไปใช้กับเครื่องคอมพิวเตอร์ของคุณเคยเข้าสู่ระบบ ... ที่มักจะทำไม่ได้เลยทีเดียวทุกคนและคุณจะไม่พบออกจนกว่าจะสายเกินไป: โดยการพิมพ์shutdownในระบบที่สำคัญซึ่งไม่ได้มีการสับของคุณ
jpaugh

@jpaugh: ใช่มันเป็นแฮ็คและฉันใช้มันเฉพาะกับเซิร์ฟเวอร์ส่วนบุคคลของฉันซึ่งฉันมักจะเข้าสู่ระบบและเทอร์มินัลยังคงเปิดอยู่นานเกินไป [หมายเหตุ: ฉันใช้พรอมต์สีที่แตกต่างกันสำหรับเครื่องส่วนตัวของฉัน: remote-root, remote-user, local-root, local-user] สำหรับเซิร์ฟเวอร์จริงและเครื่องระยะไกลฉันหลีกเลี่ยงการรูทและไปรูทน้อยที่สุดเท่าที่จะเป็นไปได้และแน่นอนโดยไม่ลืมที่จะออกจากพวกเขา ฉันแค่ใช้รีโมตของฉันเป็น "คลาวด์" (ต่อหน้า hype ของคลาวด์
Giacomo Catenazzi

1

ไฟล์ Sudoers ช่วยให้ระดับความละเอียดปลีกย่อยมากกว่า * 'ที่ได้รับอนุญาตให้ใช้ sudo' * โดยเฉพาะอย่างยิ่งคุณสามารถใช้นามแฝงคำสั่งเพื่อสร้างรายการสีขาวของกลุ่มคำสั่งที่ผู้ใช้หรือกลุ่มใดกลุ่มหนึ่งถูก จำกัด ฉันได้ทำงานกับเซิร์ฟเวอร์ระยะไกลที่ถูก จำกัด การเข้าถึง ssh และอนุญาต sudo โดยไม่ต้องใช้รหัสผ่าน (เราไม่จำเป็นต้องใช้คีย์ ssh ที่ป้องกันด้วยรหัสผ่าน) มีเหตุผลที่ดีในการทำเช่นนี้ แต่มันมีอันตรายดังนั้นเราจึงใช้นามแฝงคำสั่งเพื่ออนุญาตการเข้าถึงสิ่งที่พวกเขาต้องทำ (การรีสตาร์ทเซิร์ฟเวอร์ ฯลฯ ) โดยไม่ จำกัด สิทธิ์โดยไม่ได้รับอนุญาตสำหรับสิ่งที่พวกเขาไม่ได้ทำ

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

ผู้ชาย sudoers มีตัวอย่างที่ดีเกี่ยวกับวิธีการตั้งค่าทั้งหมดนี้

หลักสูตรนี้ต้องใช้ sudo แต่ควรไปโดยไม่บอก


1

คุณอาจตกเป็นเหยื่อของความโง่เขลาของ Ubuntu ใหม่

Ubuntu เคยมีshutdownคำสั่งแบบคลาสสิคปกติซึ่งต้องใช้เวลาในการโต้แย้ง

นี่คือสิ่งที่เกิดขึ้นกับ Ubuntu 12 หากฉันพิมพ์shutdownแม้ในฐานะผู้ใช้ทั่วไป:

$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.

แล้วก็

$ shutdown +100
shutdown: need to be root.

ตอนนี้ที่นี่คือ Ubuntu 16.10 ฉันไม่รูต:

$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to   cancel.

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

ตำหนิ Canonical


6
/sbin/shutdown ให้บริการโดยsystemd-sysvแพคเกจโดยค่าเริ่มต้นดังนั้นจึงไม่ใช่ความโง่เขลาของ Ubuntu มันเป็นsystemdความโง่เขลาและไม่ได้มาจาก Ubuntu แต่อย่างน้อยก็จาก Debian ซึ่งในทางกลับกันดูเหมือนจะsystemdเคลื่อนไหวทั้งหมดจาก Red Hat เมื่อตำหนิให้ตำหนิเอนทิตีที่ถูกต้องไม่ใช่แค่สิ่งที่คุณไม่ชอบ
Ruslan

1
@Ruslan ไม่มีใครที่บรรจุอึนี้ไว้ใน distro ของพวกเขาจะพ้นโทษจากความโง่เขลา
Kaz

0

สำหรับการปิดระบบมีมอลลี่ - การ์ด คุณเพียงแค่ต้องติดตั้งและเมื่อคุณพยายามปิดระบบผ่าน ssh ระบบจะขอให้คุณพิมพ์ชื่อโฮสต์

สำหรับการลบไฟล์มีวิธีแก้ปัญหาเช่น libtrash ซึ่งจำลองถังขยะผ่านLD_PRELOADห้องสมุด

และคุณสามารถทดสอบไฟล์ที่คุณกำลังเปลี่ยน / ลบ / ... ด้วยโปรแกรมบางที มันค่อนข้างเท่ห์เมื่อทดสอบบางอย่าง


1
maybeดูเหมือนว่าสิ่งนี้จะถูกทำลายโดยการออกแบบ: การขัดถูตึกระฟ้าที่ไม่มี ops นั้นจะทำให้โปรแกรมที่ไม่น่าสนใจเกิดความผิดพลาดซึ่งขึ้นอยู่กับตึกระฟ้าเหล่านี้ที่จะประสบความสำเร็จ
Dmitry Grigoryev

-2

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

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


พยายามที่จะไม่ทำงาน ฉันเข้าสู่shutdown, หยุดทำงานเป็นเวลา 5 วินาที, อ่านคำสั่ง (ดัง ๆ !) และฉันแน่ใจว่ามันถูกต้อง จากนั้นกด Enter แล้วคำสั่งจะถูกดำเนินการ ดังนั้นที่ไม่ได้ปิดการใช้งานคำสั่งที่น่ากลัวฉันกลัว ฉันจะลองใช้สิ่งที่โฉบนิ้วนี้บางทีระยะทางอาจเล็ก / ใหญ่เกินไป
wojciech_rak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.