Làm thế nào để vô hiệu hóa các lệnh thiết bị đầu cuối đáng sợ?


82

Làm thế nào để bạn vô hiệu hóa các lệnh thiết bị đầu cuối đáng sợ?

Tôi đã sử dụng SSH để truy cập máy chủ Ubuntu từ xa mà không cần truy cập vào máy chủ vật lý. Tôi nghĩ rằng tôi đã gõ ' shutdown' vào máy chủ NoQuery chạy trên hệ điều hành Ubuntu, nhưng thực sự tôi đã bảo máy chủ Ubuntu tắt máy. Sau đó, tôi phải nói với quản trị viên máy chủ những gì tôi đã làm để anh ta có thể khởi động máy chủ vật lý cho tôi. Thật là xấu hổ!

Làm thế nào tôi có thể giữ điều này xảy ra một lần nữa?


100
Điều này đã được thảo luận về độ dài, thường có liên quan đến rmtác dụng phụ tồi tệ hơn shutdown. Điểm mấu chốt: ở đây không có cách nào để ngăn chặn những điều xấu xảy ra nếu bạn tiếp tục chạy các lệnh ngẫu nhiên với quyền root.
Dmitry Grigoryev

5
Như những người khác đã lưu ý liên quan đến răng cưa, làm như vậy có thể khiến mọi người "có thói quen ra lệnh làm việc theo cách không chuẩn". Vì vậy, nó có vẻ tồi tệ với bất cứ ai khác rằng máy chủ NoQuery ngớ ngẩn sử dụng lệnh này?
bmb

Máy chủ NoQuery mà tôi đang sử dụng là Redis.
Đám cháy du dương

60
Chỉ không làm việc dưới tài khoản root.
alk

12
Tôi dám nói bạn đã học bài học nên sẽ không cảm thấy cần phải vô hiệu hóa bất kỳ lệnh nào nữa. Tôi cũng nói thêm rằng bạn không lừa đảo GNU / Linux, bạn sẽ trở nên tốt hơn kẻ ngốc.

Câu trả lời:


204

Câu trả lời chuẩn là "không đăng nhập với quyền root". Tất cả các lệnh chạy như root là đáng sợ. Nếu đó không phải là một tùy chọn, bạn có thể đặt một số lệnh bí danh vào .bashrcđể vô hiệu hóa các lệnh bạn thấy đặc biệt đáng sợ. Ví dụ:

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

Sau đó, nếu bạn gõ tắt máy, bạn sẽ nhận được thông báo sau:

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

( Hãy chắc chắn rằng bạn .bashrcđã tải trước, trước khi bạn thử điều này trên máy chủ sản xuất)

Thoát khỏi sshphiên hiện tại của bạn và đăng nhập lại hoặc sử dụng . ~/.bashrcnên tải / chạy .bashrc. Có lẽ hãy thử chạy rmmà không có bất kỳ đối số nào để đảm bảo rằng máy chủ của bạn không bị vô hiệu hóa tự động tải .bashrckhi đăng nhập hoặc tương tự.

Lưu ý rằng nếu bạn chủ yếu quan tâm đến việc dừng và tắt máy, bạn có thể xem xét việc cài đặt molly-Guard , điều này sẽ khiến bạn nhập tên máy chủ trước khi tắt máy. Điều này hữu ích hơn nếu bạn thường xuyên tắt toàn bộ hệ điều hành trên dòng lệnh, nhưng muốn chắc chắn rằng bạn đang tắt đúng hệ điều hành.

Bạn cũng có thể thử kiểm tra điều này với một lệnh ít đáng sợ hơn như đăng xuất hoặc thoát.


70
không đăng nhập với quyền root : điều này sẽ không hữu ích nếu bạn nhầm lẫn máy bạn đã đăng nhập. Tôi đề nghị thay đổi lời nhắc thành thứ gì đó sẽ cung cấp cho bạn một gợi ý trực quan.
isanae

145
Theo kinh nghiệm của tôi, các lệnh "đáng sợ" để có hành vi "an toàn" là một ý tưởng tồi. Điều này là do mọi người có xu hướng tập thói quen làm việc theo cách không chuẩn, điều này có thể khiến họ làm một số điều rất đáng tiếc khi họ ở trên một hệ thống vanilla. Câu trả lời đơn giản là bước đi rất cẩn thận khi đăng nhập bằng root.
TimGJ

22
@isanae Phím tắt tôi sử dụng để mở một thiết bị đầu cuối có ssh đến máy chủ sản xuất sẽ làm cho nền thiết bị đầu cuối sáng màu đỏ. Điều đó khiến tôi chú ý.
Peter A. Schneider

6
sourcelà một bí danh .và không được hỗ trợ bởi tất cả các shell.
gronostaj

4
Cũng lưu ý rằng trong khi Debian và, bằng phần mở rộng, Ubuntu có ~/.bash_profilenguồn mặc định .bashrc, đó không phải là hành vi tiêu chuẩn và trên hầu hết các hệ thống, .bashrckhông được đọc khi đăng nhập qua ssh, vì vậy điều này sẽ không tạo ra sự khác biệt ở đó. Tốt hơn là thêm các bí danh ~/.profilehoặc ~/.bash_profilethay vào đó.
terdon

73

sudotồn tại vì một lý do - sử dụng nó. Khi lệnh của bạn (trong trường hợp này là CLI tương tác) kết thúc, bạn sẽ được đưa trở lại trình bao cấp người dùng chứ không phải trình bao gốc. Có rất ít lý do xứng đáng để ở trong một vỏ gốc. (Tôi ngạc nhiên vì đây chưa phải là câu trả lời ...)

Đã nói rằng, đừng là một muppet sử dụng sudocho tất cả mọi thứ . Hiểu những gì bạn đang làm và hiểu lý do tại sao nó không / không yêu cầu quyền root.


Ngoài ra, bạn có thể phân biệt lời nhắc của bạn cho shell / người dùng. Điều này cũng làm cho rõ ràng hơn rằng bạn quay lại dấu nhắc shell chứ không phải " một số CLI khác ". Mine là rất nhiều màu sắc, và có rất nhiều thông tin hữu ích (ví dụ như tên máy), mà làm cho nó rất đơn giản để biết những gì máy chủ lệnh sẽ thực thi trên, và cũng có thể làm cho nó dễ dàng hơn để nhìn lại xuyên suốt lịch sử của mình và xác định vị trí dẫn - một gốc shell sử dụng dấu nhắc mặc định.

PS1 của tôi

Điều này phù hợp hơn để sử dụng trên tài khoản " của bạn ", nhưng nếu bạn đang thực hiện nghiêm túc bảo mật / sysadminning, thì bạn sẽ không chia sẻ mật khẩu / tài khoản và bạn sẽ không ngồi trong vỏ gốc mà không nhận thức đầy đủ.


Như mọi người đã nói hết lần này đến lần khác, " các lệnh bí danh để tạo ra một môi trường an toàn là một ý tưởng tồi ". Bạn sẽ cảm thấy thoải mái trong môi trường an toàn của mình, gõ những lệnh 'đáng sợ' đó vào nơi bạn không nên làm. Sau đó, một ngày nào đó bạn sẽ thay đổi công việc hoặc đăng nhập vào một máy mới và sau đó bùng nổ " Rất tiếc, tôi không có ý đó, tôi xin lỗi " ...



2
Anh ta sẽ không có cùng một vấn đề với sudo shutdown? Nếu anh ta thực hiện nó trên máy sai, nó vẫn sẽ là một thảm họa.
Barmar

2
@Barmar NoQuery có hiểu lệnh sudo không?
Taemyr

2
@Taemyr sudolà một lệnh shell, nó không liên quan gì đến cơ sở dữ liệu.
Barmar

4
@Barmar: Thật ra tôi nghĩ OP có nghĩa là nhập nó vào chương trình cmdline của NoQuery chứ không phải vào bash. Vì vậy, họ sẽ không gõ sudo shutdown, vì tôi cho rằng đó sudokhông phải là lệnh NoQuery. Không ở trong một vỏ gốc sẽ hoàn toàn giải quyết vấn đề đó và là một ý tưởng rất tốt. Vì vậy, sẽ xem xét nhắc nhở cẩn thận trước khi chạy các lệnh quan trọng.
Peter Cordes

44

Gói 'molly-Guard' (ít nhất là trên các hệ thống có nguồn gốc Debian) sẽ cài đặt một trình bao bọc xung quanh tắt máy, tạm dừng, tắt nguồn và khởi động lại. Nếu nó phát hiện ra rằng thiết bị đầu cuối là một thiết bị từ xa, thì nó sẽ nhắc tên của máy chủ lưu trữ. Nếu nó không khớp, thì lệnh sẽ bị hủy.


4
những thứ khác (đáng sợ hơn) đáng sợ như thế rm -rf /nào?
marcellothearcane

9
@marcellothearcane set -ucó thể giúp với điều đó trong một số trường hợp, như khi viết rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT.
Alex Hall

4
@marcellothearcane Trên bất cứ thứ gì tương tự như một hệ thống Linux hiện đại, đó là nhu cầu --no-preserve-rootmà bạn không thể gõ một cách tình cờ.
một CVn

3
Ai là Molly, tôi tự hỏi ... có lẽ là con mèo của ai đó.
the0ther

7
@ the0ther, một đứa trẻ 2 tuổi, người đã kích hoạt công tắc SCRAM trên máy khủng long, hai lần trong cùng một ngày. Họ ở trong phòng lắp một cái nắp trên công tắc. catb.org/jargon/html/M/molly-guard.html
CSM

4

Tôi đã chấp nhận một câu trả lời mà tôi thích rất nhiều, tuy nhiên, nếu có ai khác đang đọc và muốn một câu trả lời đơn giản hơn, thì đây là của tôi.

Tìm tệp .bashrc và đặt làm dòng cuối cùng:

alias shutdown=notforuse

Sau đó, khi bạn gõ tắt máy, bạn nhận được một cái gì đó như ~bash: notforuse is not a command

Điều này có thể là ngớ ngẩn nhưng nó đơn giản và nó hoạt động. Tôi đánh giá cao câu trả lời với những cách tốt hơn để làm điều này tuy nhiên!


4
Hừm, tôi đã từng làm điều này với rmđể troll mọi người -alias rm='echo "You can't use rm!" #'
MD XF

52
Tôi nghĩ rằng đây là một ý tưởng tồi, vì ba lý do. Đầu tiên, nó gây nhầm lẫn cho bất kỳ ai khác có quyền truy cập root vào máy. Thứ hai, nó huấn luyện bạn rằng bạn có thể gõ "shutdown" và nhấn enter, điều đó có nghĩa là bạn có thể mắc lỗi tương tự trên hệ thống tiếp theo mà bạn có quyền truy cập root. Thứ ba, điều này sẽ trở nên cực kỳ khó hiểu nếu có một lệnh hợp lệ được gọi notforusetrên đường dẫn.
David Richerby

5
Tôi với @DavidR Richby về điều này. Không phải là một ý tưởng tốt.
Tico

Nếu bạn thực sự muốn sử dụng các bí danh, ít nhất bạn có thể đặt tất cả các bí danh lệnh đáng sợ đó vào một tệp, hãy để chúng tôi nói ~/.SaveMyReputationvà thêm dưới dạng dòng cuối cùng của .bashrcmột dòng [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation. Cuối cùng, bạn có thể muốn thêm một dòng echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"bên trong tệp đó. Ít nhất bạn có thể mang theo tệp bí danh này trên máy khác (nên .bash_aliases, nhưng trong trường hợp "không dùng nữa" thì tốt hơn là sử dụng tên khác).
Hastur

Nếu bạn sẽ làm điều này, hãy làm cho nó bớt khó hiểu hơn bằng cách sử dụng một tên như thế nào alias shutdown=shutdown-disabled-by-an-alias. (Điều này chỉ giải quyết vấn đề thứ 3 và nhỏ nhất mà @DavidR Richby đã chỉ ra.) Mặc dù có lẽ sẽ chỉ mất 2 giây để người tiếp theo chuyển từ nhìn notforuse is not a commandsang chạy type -a shutdownvà tìm bí danh, sau đó nhập sudo \shutdownđể tắt mở rộng bí danh. (Giả sử họ đã đặt sudobí danh để sudo='sudo 'nó mở rộng bí danh trong đối số đầu tiên của nó).
Peter Cordes

1

Đối với shutdown( reboot, haltvà có liên quan): Tôi có một bản sao với hỏi tôi nếu tôi thực sự chắc chắn (và nó không làm gì anyway). Tôi lưu trữ các kịch bản như vậy trong /usr/local/sbin. Trên Debian cái này được ưu tiên khác /sbin(nó là thư mục đầu tiên của PATH).

Các tập lệnh hệ thống sử dụng đường dẫn đầy đủ, do đó, việc hack này ngăn tôi dừng máy chủ từ xa thay vì máy cục bộ (một hành vi xấu từ Awesome WM), nhưng không có tác dụng gián tiếp khác và tôi vẫn có thể sử dụng chúng như / sbin / shutdown khi thực sự cần thiết .


Những bản hack như vậy chỉ hoạt động nếu bạn áp dụng chúng cho mọi máy tính mà bạn từng đăng nhập vào ... điều đó thường không thực tế và bạn sẽ không phát hiện ra cho đến khi quá muộn: bằng cách gõ shutdownvào một hệ thống quan trọng không có hack của bạn.
jpaugh

@jpaugh: yeah, nó là một hack và tôi chỉ sử dụng nó cho các máy chủ cá nhân của tôi, nơi tôi thường đăng nhập và các thiết bị đầu cuối vẫn mở quá nhiều thời gian. [Lưu ý: Tôi cũng sử dụng các lời nhắc màu khác nhau cho các máy cá nhân của mình: root-remote, remote-user, local-root, local-user]. Đối với các máy chủ thực và máy từ xa, tôi tránh root và tôi root ít nhất có thể, và chắc chắn, không quên thoát khỏi chúng. Chỉ là tôi đang sử dụng các điều khiển từ xa của tôi là "đám mây" (trước khi cường điệu đám mây, do đó được xử lý theo cách cũ).
Giacomo Catenazzi

1

Tệp Sudoers cho phép mức độ chi tiết tốt hơn nhiều so với chỉ * 'được phép sử dụng sudo' *, đặc biệt bạn có thể sử dụng các bí danh lệnh để tạo danh sách trắng các nhóm lệnh mà một người dùng hoặc nhóm cụ thể bị hạn chế. Tôi đã làm việc với các máy chủ từ xa bị hạn chế truy cập ssh và cho phép sudo không có mật khẩu (chúng tôi đã yêu cầu các khóa ssh được bảo vệ bằng mật khẩu). Có một số lý do chính đáng để làm điều này, nhưng nó có những nguy hiểm, vì vậy chúng tôi đã sử dụng các bí danh lệnh để cho phép truy cập không hạn chế vào những việc họ cần làm (khởi động lại máy chủ, v.v.) mà không cấp cho họ đặc quyền cho những điều họ không làm.

Ngoài ra còn có cú pháp để nói 'không thể chạy lệnh này' . Nó có thể được xử lý xung quanh, vì vậy nó không nên được sử dụng như một biện pháp bảo mật thực sự nhưng nó sẽ hoạt động cho kịch bản bạn mô tả.

Man sudoers có một số ví dụ hay về cách thiết lập tất cả.

Tất nhiên điều này đòi hỏi phải sử dụng sudo, nhưng điều đó nên đi mà không nói.


1

Bạn có thể đã trở thành nạn nhân của một số ngu ngốc Ubuntu mới.

Ubuntu đã từng có lệnh thông thường, cổ điển shutdowncần một đối số thời gian bắt buộc.

Đây là những gì xảy ra trên Ubuntu 12 nếu tôi gõ shutdown, ngay cả với tư cách là người dùng thông thường:

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

Sau đó

$ shutdown +100
shutdown: need to be root.

Bây giờ, đây là Ubuntu 16.10. Tôi không root:

$ 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.

Không có đối số, nó lập lịch tắt máy trong 60 giây sau đó và ngay cả khi bạn không root root chỉ là một tài khoản được tạo với quyền quản trị viên.

Đổ lỗi cho Canonical.


6
/sbin/shutdown được cung cấp theo systemd-sysvgói theo mặc định, vì vậy, đó không phải là sự ngu ngốc của Ubuntu, đó là systemdsự ngu ngốc và nó không phải từ Ubuntu, mà ít nhất là từ Debian, đến lượt nó, dường như lấy toàn bộ systemdchuyển động từ Red Hat. Khi đổ lỗi, hãy đổ lỗi cho thực thể chính xác - không chỉ là người bạn không thích.
Ruslan

1
@Ruslan Không ai gói cái thứ nhảm nhí này vào bản phân phối của họ thoát khỏi sự đổ lỗi của sự ngu ngốc.
Kaz

0

Đối với tắt máy có bảo vệ molly. Bạn chỉ cần cài đặt nó và khi bạn cố gắng tắt máy qua ssh, nó sẽ yêu cầu bạn nhập tên máy chủ.

Để xóa các tập tin, có các giải pháp như libtrash, mô phỏng thùng rác thông qua LD_PRELOADthư viện.

Và bạn có thể kiểm tra những tập tin bạn đang thay đổi / xóa / ... với chương trình có thể . Điều đó thật tuyệt khi thử nghiệm một cái gì đó.


1
Điều này maybedường như bị phá vỡ bởi thiết kế: khai thác một số tòa nhà không có hoạt động sẽ phá vỡ bất kỳ chương trình không tầm thường nào dựa vào các tòa nhà này để thành công.
Dmitry Grigoryev

-2

Hãy thử điều này: khi bạn đang ở trên một vỏ từ xa, mỗi khi bạn định gõ phím "return", dừng lại trong 5 giây, với ngón tay của bạn di chuột vào phím "return" và đọc lại lệnh bạn sắp gửi. Là nó ổn? Bạn có chắc không?

Điều này có vẻ khắc nghiệt, nhưng mặt khác, chúng ta không nên dành nhiều thời gian cho đạn pháo từ xa. Chúng ta nên tìm mọi cách để tự động hóa công việc bảo trì của mình để hiếm khi, nếu có, cần phải đăng nhập vào một máy chủ từ xa.


Đã thử điều đó, không làm việc. Tôi bước vào shutdown, dừng lại trong 5 giây, đọc lại lệnh (to!) Và tôi chắc chắn rằng nó đã đúng. Sau đó nhấn enter và lệnh vừa được thực thi. Vì vậy, tôi đã không vô hiệu hóa các lệnh đáng sợ, tôi sợ. Tôi sẽ thử với ngón tay lơ lửng thứ này, có lẽ khoảng cách quá nhỏ / lớn.
wojciech_rak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.