무서운 터미널 명령을 비활성화하는 방법?


82

무서운 터미널 명령을 어떻게 비활성화합니까?

물리적 서버에 액세스하지 않고 SSH를 사용하여 원격 우분투 서버에 액세스했습니다. shutdownUbuntu OS에서 실행되는 NoSQL 서버에 ' '를 입력하고 있다고 생각 했지만 실제로 Ubuntu 서버를 종료하도록 지시했습니다. 그런 다음 서버 관리자에게 물리적 서버를 시작할 수 있도록 내가 한 일을 알려야했습니다. 당황 스러웠어요!

이 문제가 다시 발생하지 않도록하려면 어떻게해야합니까?


100
이것은 일반적으로 rm보다 더 나쁜 부작용을 갖는 것과 관련하여 길게 논의되었습니다 shutdown. 결론 : 무작위 명령을 루트로 계속 실행하면 나쁜 일이 발생하는 것을 막을 수있는 방법이 없습니다.
Dmitry Grigoryev

5
다른 사람들이 앨리어싱에 관해 언급했듯이, 그렇게하면 사람들이 "비표준 방식으로 명령을 수행하는 습관을 들이게"할 수 있습니다. 어리석은 NoSQL 서버가이 명령을 사용하는 것이 다른 사람에게는 나쁜 것 같습니까?
bmb

내가 사용하고 있던 NoSQL 서버는 Redis입니다.
MelodiousFires 2016 년

60
루트 계정으로는 작동하지 않습니다.
alk

12
나는 당신이 교훈을 배웠다고 감히 말해서 명령을 다시 비활성화 할 필요가 있다고 느낄 필요가 없습니다. 또한 GNU / 리눅스를 완벽하게 방지 할 수는 없지만 바보보다 더 나아질 것이라고 덧붙였습니다.

답변:


204

표준 답변은 "루트로 로그인하지 마십시오"입니다. 루트로 실행되는 모든 명령은 무섭습니다. 이것이 옵션이 아닌 경우 일부 .bashrc무서운 명령을 비활성화하여 명령을 비활성화 할 수 있습니다. 예를 들면 다음과 같습니다.

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

그런 다음 shutdown을 입력하면 다음 메시지가 표시됩니다.

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

( 확인 당신이 .bashrc먼저로드 당신이 시도하기 전에 프로덕션 서버에서)

현재 ssh세션을 종료하고 다시 로그인하거나 . ~/.bashrc.bashrc를로드 / 실행해야합니다. 아마도 rm서버가 .bashrc로그인이나 이와 유사한 것에서 자동로드 를 비활성화하지 않도록 인수없이 실행 해보 십시오 .

주로 중지 및 종료와 관련된 경우 molly-guard 설치를 고려 하면 시스템을 종료하기 전에 호스트 이름을 입력 할 수 있습니다. 명령 행에서 전체 OS를 정기적으로 종료하지만 올바른 OS를 종료하려는 경우 더 유용합니다.

로그 아웃 또는 종료와 같이 덜 무서운 명령으로이를 테스트 할 수도 있습니다.


70
루트로 로그인하지 마십시오. 로그인 한 컴퓨터를 혼동하는 경우 도움이되지 않습니다. 프롬프트 를 시각적 신호를 줄 수있는 것으로 변경하는 것이 좋습니다 .
isanae

145
"안전한"동작을 갖도록 "scary"명령을 앨리어싱하는 것은 제 경험상 나쁜 생각입니다. 사람들은 바닐라 시스템에있을 때 매우 유감스러운 일을 할 수있는 비표준 방식으로 명령을 수행하는 경향이 있기 때문입니다. 간단한 대답은 루트로 로그인 할 때 매우 신중하게 걷는 것입니다.
TimGJ

22
@isanae 프로덕션 서버에 ssh를 사용하여 터미널을 여는 데 사용한 바로 가기는 터미널 배경을 밝은 빨간색으로 만듭니다. 그 때문에주의를 기울였습니다.
피터 A. 슈나이더

6
source.모든 쉘 에서 별명 이며 모든 쉘에서 지원되는 것은 아닙니다.
gronostaj

4
또한 데비안과 확장에 의해 우분투에는 표준 동작이 아니며 대부분의 시스템 에서 ssh를 통해 로그인 할 때 읽히지 않는 defaullt ~/.bash_profile소스 .bashrc.bashrc있으므로 차이가 없습니다. 별명을 대신 ~/.profile또는 에 추가하는 것이 훨씬 좋습니다 ~/.bash_profile.
terdon

73

sudo이유가 있으므로 사용하십시오. 명령 (이 경우 대화식 CLI)이 완료되면 루트 셸이 아닌 사용자 수준 셸로 다시 덤프됩니다. 루트 쉘에 있어야 할 합당한 이유는 거의 없습니다. (이것이 이미 답변이 아니라는 것에 놀랐습니다 ...)

데이 사용하는 도련님하지 않는 것이 말했다 sudo에 대한 모든 것을 . 하고있는 일을 이해하고 왜 루트 권한이 필요하지 않은지 이해하십시오.


또한 루트 / 사용자 셸에 대한 프롬프트를 차별화 할 수 있습니다. 또한 " 다른 CLI "가 아니라 쉘 프롬프트로 돌아 왔음을보다 명확하게합니다 . 광산은 매우 화려하고 많은 유용한 정보 (예 : 호스트 이름)를 가지고있어 명령이 실행될 호스트를 매우 간단하게 알 수 있으며 역사를 되돌아보고 프롬프트를 쉽게 찾을 수 있습니다-루트 shell은 기본 프롬프트를 사용합니다.

내 PS1

이것은 "에 사용하는 것이 더 적합 당신의 "계정,하지만 당신은 당신이 암호 / 계정을 공유되지 않으며, 완전히 의식하지 않고 루트 쉘에 앉아되지 않습니다, 심각 sysadminning / 보안을 복용하는 경우.


사람들이 계속해서 말했듯이 " 안전한 환경을 만들기위한 명령 앨리어싱은 나쁜 생각 "입니다. 안전하지 않은 곳에 'scary'명령을 입력하여 안전한 환경에서 편안하게 사용할 수 있습니다. 그러다가 언젠가는 직업을 바꾸거나 새 기계에 로그인 한 다음 " 아무리 붐을 일으켰습니다 .



2
그는 같은 문제가 sudo shutdown없을까요? 그가 잘못된 시스템에서 실행하면 여전히 재앙이 될 것입니다.
Barmar

2
@Barmar NoSQL은 sudo 명령을 이해합니까?
Taemyr

2
@Taemyr sudo는 쉘 명령이며 데이터베이스와 관련이 없습니다.
Barmar

4
@Barmar : 실제로 OP는 bash가 아닌 NoSQL cmdline 프로그램에 입력해야한다고 생각합니다. 따라서 NoSQL 명령이 아니라고 sudo shutdown가정 sudo하기 때문에을 입력하지 않았을 것 입니다. 루트 쉘에 있지 않다면 그 문제를 완전히 해결했을 것이고 아주 좋은 생각이었습니다. 중요한 명령을 실행하기 전에 프롬프트를주의 깊게 살펴보십시오.
Peter Cordes

44

패키지 'molly-guard'(적어도 데비안 파생 시스템에서는)는 종료, 정지, 전원 끄기 및 재부팅 주위에 래퍼를 설치합니다. 터미널이 원격 터미널임을 감지하면 호스트 이름을 입력하라는 메시지가 표시됩니다. 일치하지 않으면 명령이 취소됩니다.


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
2 살짜리 아이 @ the0ther는 같은 날 두 번 공룡 기계에서 SCRAM 스위치를 작동시켰다. 그들은 방에있는 사람들이 스위치의 덮개를 조작했습니다. catb.org/jargon/html/M/molly-guard.html
CSM

4

나는 많은 것을 좋아한다고 대답했지만, 다른 사람이 읽고 있고 더 간단한 대답을 원한다면 여기에 내 것이 있습니다.

.bashrc 파일을 찾아 마지막 줄로 넣으십시오.

alias shutdown=notforuse

그런 다음 shutdown을 입력하면 다음과 같은 결과가 나타납니다. ~bash: notforuse is not a command

이것은 어리석은 것일 수도 있지만 간단하고 작동합니다. 그러나이 작업을 수행하는 더 좋은 방법으로 답변을 주셔서 감사합니다!


4
흠, 나는 rm사람들을 트롤 하기 위해 이것을 사용 alias rm='echo "You can't use rm!" #'
MD XF

52
나는 이것이 세 가지 이유로 나쁜 생각이라고 생각합니다. 첫째, 컴퓨터에 대한 루트 액세스 권한이있는 다른 사람에게는 혼란 스럽습니다. 둘째, "종료"를 입력하고 Enter 키를 누르는 것이 좋습니다. 이는 다음에 액세스 할 수있는 루트 시스템에서 같은 실수를 저지를 가능성이 있음을 의미합니다. 셋째, notforuse경로에 유효한 명령이 있으면 혼란 스럽습니다 .
David Richerby 2012 년

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. (이는 @DavidRicherby가 지적한 세 번째로 작은 문제 만 해결합니다.) 다음 사람 이 별명 을보고 notforuse is not a command실행 type -a shutdown하고 찾은 다음 sudo \shutdown별명 확장을 사용하지 않으려면 입력 하는 데 2 초 밖에 걸리지 않습니다. ( sudo별명이 있다고 가정하면 sudo='sudo '첫 번째 인수에서 별명이 확장됩니다).
Peter Cordes

1

대한 shutdown( reboot, halt관련) : 내가 정말 확신 (그리고 어쨌든 아무것도하지 않는) 경우 나 한테 물어와 사본을 가지고있다. 그런 스크립트를에 저장 /usr/local/sbin합니다. 데비안에서는 우선 순위가 우선합니다 /sbin(PATH의 첫 번째 디렉토리입니다).

시스템 스크립트는 전체 경로를 사용하므로 이러한 해킹 은 로컬 컴퓨터 대신 원격 서버를 중지하지 못하게 하지만 ( Awesome WM 의 나쁜 동작 ) 다른 간접 효과는 없으며 실제로 필요할 때 / sbin / shutdown으로 사용할 수 있습니다 .


이러한 해킹은 로그인 한 모든 컴퓨터에 적용 할 경우에만 작동합니다. 종종 비현실적이며 너무 늦을 때까지는 해킹 shutdown없는 중요한 시스템 에 입력하여 찾을 수 없습니다 .
jpaugh

@jpaugh : 예, 그것은 해킹이며, 종종 로그인하는 개인 서버에만 사용되며 터미널은 너무 오랫동안 열려 있습니다. [참고 : 개인 컴퓨터에는 원격 루트, 원격 사용자, 로컬 루트, 로컬 사용자 등 다른 색상 프롬프트도 사용합니다]. 실제 서버와 원격 컴퓨터의 경우 루트를 피하고 가능한 한 적게 루트로 이동합니다. 방금 리모컨을 "클라우드"로 사용하고 있습니다 (클라우드 과장 전에 이전 방식으로 처리).
Giacomo Catenazzi

1

Sudoers 파일은 * 'sudo를 사용할 수 있습니다'*보다 더 세밀한 수준의 세분성을 허용합니다. 특히 명령 별명을 사용하여 특정 사용자 또는 그룹이 제한하는 명령 그룹의 화이트리스트를 작성할 수 있습니다. ssh 액세스로 제한되고 암호가없는 sudo를 허용하는 원격 서버로 작업했습니다 (암호로 보호되는 ssh 키가 필요했습니다). 이를 수행하는 데에는 몇 가지 이유가 있지만, 위험이 있으므로 명령 별칭을 사용하여 필요하지 않은 작업에 대한 권한을 부여하지 않고 수행해야 할 작업 (서버 다시 시작 등)에 무제한으로 액세스 할 수있었습니다.

'이 명령을 실행할 수 없습니다'라는 구문도 있습니다 . 이 문제는 해결 될 수 있으므로 실제 보안 수단으로 사용해서는 안되지만 설명 된 시나리오에서는 작동합니다.

Man sudoers는이 모든 것을 설정하는 방법에 대한 좋은 예를 가지고 있습니다.

물론 이것은 sudo를 사용해야하지만 아무 말도하지 않아야합니다.


1

새로운 우분투 어리 석음의 희생양이되었을 수도 있습니다.

우분투는 일반적으로 고전적인 shutdown명령을 가지고 있었으며 필수 시간 인수가 필요합니다.

shutdown일반 사용자로 입력 해도 Ubuntu 12에서 발생하는 상황은 다음과 같습니다 .

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

그때

$ shutdown +100
shutdown: need to be root.

자, 여기 우분투 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 초 후에 종료 일정이 설정되며, 루트 권한이 아니더라도 관리자 권한으로 만든 계정 일뿐입니다.

정식 비난.


6
/sbin/shutdown systemd-sysv기본적 으로 패키지에 의해 제공 되므로 우분투 어리 석음이 아니며 어리 석음이며 systemd우분투에서 온 것이 아니라 데비안에서 온 것 systemd입니다. 비난 할 때, 당신이 싫어하는 것이 아니라 올바른 존재를 비난하십시오.
Ruslan

1
@Ruslan이 쓰레기를 자신의 배포판에 담은 사람은 어리 석음의 비난을 피할 수 없습니다.
Kaz

0

종료를 위해 molly-guard가 있습니다. 설치 만하면되고 ssh를 통해 종료하려고하면 호스트 이름을 입력하라는 메시지가 나타납니다.

파일을 삭제하려면 LD_PRELOAD라이브러리 를 통해 휴지통을 에뮬레이트하는 libtrash와 같은 솔루션이 있습니다.

그리고 아마도 프로그램으로 어떤 파일을 변경 / 삭제 / ...하는지 테스트 할 수 있습니다 . 무언가를 테스트 할 때 꽤 멋지다.


1
maybe문제는 의도적으로 설계된 것 같습니다. 일부 syscall을 no-ops로 스텁하면이 syscall에 의존하는 사소한 프로그램이 중단됩니다.
Dmitry Grigoryev

-2

원격 쉘에있을 때 "return"키를 입력하려고 할 때마다 "return"키에 손가락을 대고 5 초 동안 멈추고 보내려는 명령을 다시 읽으십시오. 괜찮습니까? 확실합니까?

이것은 가혹한 것처럼 보이지만 다른 한편으로는 원격 쉘에 많은 시간을 소비해서는 안됩니다. 유지 관리 작업을 자동화하여 원격 서버에 로그인 할 필요가 거의없는 모든 방법을 찾아야합니다.


작동하지 않는 것을 시도했습니다. 을 입력 shutdown하고 5 초 동안 멈췄다가 명령을 다시 읽었습니다. 그런 다음 Enter 키를 누르면 명령이 방금 실행되었습니다. 그래서 무서운 명령을 비활성화하지는 않았습니다. 나는이 손가락으로 움직이는 것을 시도 할 것입니다. 아마도 거리가 너무 작거나 컸습니다.
wojciech_rak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.