it-swarm-ko.tech

명령 줄 안전 수칙

명령 줄과 스크립팅은 위험합니다. rm -rf로 약간 오타를하면 상처를 입을 수 있습니다. 가져 오기 스크립트를 실행하는 동안 데이터베이스 이름에서 stage와 혼동을 일으키면 뼈가납니다 (동일한 서버에 있지만 좋지 않은 경우). 쉐딩 한 서버 이름이 일부 명령을 수행 한 후 생각했던 것과 다르다는 것을 너무 늦게 알아 차린 것과 동일합니다. Hole Hawg 를 존중해야합니다.

위험한 명령을 실행하기 전에 몇 가지 작은 의식이 있습니다. 예를 들어 서버를 세 번 점검하는 것과 같습니다. 다음은 rm 안전에 관한 흥미로운 기사 입니다.

커맨드 라인에서 안전을 유지하는 작은 의식, 도구 및 요령은 무엇입니까? 그리고 "첫 실행 ls foo *와 같은 객관적인 것들을 의미합니다. 그 결과를보고 나서 ls를 rm -rf로 대체하여 rm -rf foo * 또는 그와 비슷한 것을 실행하지 않도록하십시오." 명령이 수행됩니다. ".

34
deadprogrammer

잘 작동하는 것은 Prod/Staging/test 서버를 위해 Shell에서 다른 배경색을 사용하는 것입니다.

45
andyhky

시작하기 전에 취소 계획을 염두에 두십시오.

  • 파일/디렉토리를 즉시 삭제하지 말고 압축하십시오.
  • 'x'분 후에 재부팅하도록 (Cisco) 라우터를 설정하고 바로 'wr'하지 마십시오
  • 변경중인 인터페이스가 시스템에 입력 한 인터페이스가 아닌지 확인하십시오. 이것은 텔넷에 연결 한 라우터 인터페이스이거나 VNC에 연결된 이더넷 포트 일 수 있습니다.
  • 절대 'root'로 로그인하지 마십시오
  • 백업을합니다. 그것이 좋은지 확인하십시오. 다른 것을 만드십시오.
  • 신뢰하는 사람에게 '여기서 바보 같은 짓을하려고합니까?'
14
Peter

이것은 Windows Powershell에만 해당됩니다.

정책으로 각 서버에 다음과 같은 시스템 프로파일을 추가합니다. 이를 통해 다음이 충족됩니다.

  1. 관리자 powershell 콘솔 창은 어두운 빨간색 배경색을 갖습니다.
  2. 제목에 관리자가 추가되었습니다.
  3. "경고 : Powershell이 ​​관리자로 실행 중입니다."메시지 시작할 때 작성
  4. 제목 표시 줄 앞에 "관리자 :"
  5. 회사 유틸리티 스크립트, vim 및 infozip과 같은 표준 유틸리티가 경로에 있습니다.
 $ currentPrincipal = 새로운 개체 Security.Principal.WindowsBuiltInRole] :: Administrator)) 
 {
 (get-Host) .UI.RawUI.Backgroundcolor = "DarkRed"
 clear-Host 
 write-Host "경고 : PowerShell이 ​​관리자로 실행 중입니다 .'n"
} 
 
 $ utilities = $ null 
 if ([IntPtr] :: size * 8 -eq 64) 
 {
 $ Host.UI.RawUI.WindowTitle = "Windows PowerShell (x64)"
 $ utilities = "$ {env : programfiles (x86) }\유틸리티 "
} 
 else 
 {
 $ Host.UI.RawUI.WindowTitle ="Windows PowerShell (x86) "
 $ utilities = "$ {env : programfiles}\Utilities"
} 
 if ((Test-Path $ utilities)-및! ($ env : path -match $ utilities.Replace ( "\", "\\"))) 
 {
 $ env : path = "$ utilities; $ {env : path} "
} 
} 
 
 기능 프롬프트 
 {
 if ($ currentPrincipal.IsInRole ([Security .Principal.WindowsBuiltInRole] :: Administrator)) 
 {
 if (! $ Host.UI.RawUI.WindowTitle.StartsWith ( "Administrator :")) 
 {$ Host. UI.RawUI.WindowTitle = "관리자 :"+ $ Host.UI.RawUI.WindowTitle} 
} 
 'PS'+ $ (if ($ nestedpromptlevel -ge 1) { '>>' }) + '>'
} 
10
Brian Reiter

나는 이들 중 일부에 대한 최첨단 솔루션을 가지고 있습니다.

나는 루트로 일할 계획을 가질 때 다음과 같은 습관을 들이지 않았다.

  • 먼저 일반 사용자로 로그인 한 다음 Sudo su - root 루트로 전환합니다. 나는 이것을 정신적 준비로서, 내가 매우 위험한 지역으로 정신적으로 걸어 왔으며 항상 경계하고 경계해야한다는 것을 상기시켜줍니다. 재미있게 들리 겠지만,이 작은 의식만으로도 나는 부주의 할 수 없다라는 것을 강화함으로써 많은 슬픔을 구할 수있었습니다.
  • 각 명령은 입력되었지만 [Return] 키는 never을 눌렀습니다. Never.
  • 어떤 명령도 ever 이해하지 않고 실행 정확하게 그것이하는 일. 무엇을하는지 모르는 상태에서이 작업을 수행하면 시스템에서 러시아 룰렛 을 재생합니다.
  • Before [Return] 키를 누르면 CLI에서 실행 된 명령을주의 깊게 검사합니다. 망설임, 잠재적 문제에 대한 힌트가 있으면 다시 검토해야합니다. 망설임이 지속되면 명령이 줄에 남아 있고 맨 페이지 등을 참조하기 위해 다른 콘솔에 alt-F2를 누릅니다. 그래픽 세션 인 경우 브라우저를 시작하고 검색을 수행합니다.
  • 내 시스템에서 Sudo을 (를) 전달한 일반 사용자는 없습니다. not나는 BOFH 이기 때문에, 준비와 훈련 없이는 다음과 같습니다. 원숭이에게 총을 싣고 원숭이가 배럴을 내려다보고 압착 할 때까지 처음에는 재미 있고 재미 있습니다 ...

Rm을 사용할 때는 항상 디렉토리에 cd를 먼저 _하고 접두사 ./ 디렉토리가 올바른지 확인하십시오.

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

또는 파일의 전체 경로를 지정합니다

rm /usr/some/directory/targetfile

그것은 PITA이지만 ... 미안보다 안전합니다.

10
Avery Payne

위의 모든 답변에 동의 할 수는 있지만 매우 중요한 팁을 강조해야합니다.

멀티 태스킹을 피할시기를 알아야합니다.

6
ojblass

서버를 변경하기 전에 알아야 할 중요 사항이 거의 없습니다 :

  • 내가 올바른 서버에 있는지 확인하십시오

  • **이 행동으로 얼마나 많은 사람들이 영향을 받을지 *에 유의하십시오 (실수 여부)

  • 'enter'키를 입력하기 전에 취소 가능성

  • 이 명령이 세션 연결 끊기 (fw 규칙, 잘못된 종료 등) 가능성이 있는지 자문하십시오. 다시 시작할 장애 조치가 있는지 확인하십시오 (특히 외부에있는 경우).

5
l0c0b0x

내가 사용하는 시스템의 호스트 이름이 bash (또는 다른 쉘) 프롬프트에 있는지 확인하십시오. 내가 뿌리를 내렸다면, 어떻게 든 거기에 있는지 확인하십시오.

한때 다른 라이브 리눅스 배포판에서 젠투 시스템을 설치하고 실수로 잘못된 쉘에서 다소 파괴적인 명령을 실행했습니다 (ATM이 무엇인지 기억하지 못합니다-rm의 변형). chroot 내의 내용이 아닌 라이브 시스템에서 삭제됩니다. 그때부터 나는 항상

export PS1="(chroot) $PS1"

내가 chroot 내에서 일할 때마다.

5
Tim

규칙 1-백업 만들기

규칙 2- NEVER 표준 명령에 "molly guard"래퍼를 추가하고, 자신 만의 버전을 만들지 만, 이름을 인계하지 마십시오. 설정하지 않은 시스템에있을 때 물기 만하면됩니다.

루트 및 (부분) 디렉토리 트리에 대해 다른 색상과 같은 프롬프트 트릭은 훌륭한 도우미이지만 다시 한 번 사용하지 않고도 작업 할 수 있습니다.

4
LapTop006

아직 수행하지 않은 경우 rm-rm -i

4
trent

이것은 직관적이지 않은 것처럼 보이지만, 내가 가진 최고의 명령 줄 안전 팁은 다음과 같습니다. GUI 모드 대안이 가능하고 실용적이라면 USE IT.

왜? 아주 간단합니다. GUI 모드에는 일반적으로 "경고-프리 블 롭프를 막으려 고합니다.이 작업을 수행 하시겠습니까?"의 형태로 내장 안전망이 있습니다. 그렇지 않더라도 속도가 느려져 생각할 시간을 더 많이줍니다. 커밋하기 전에 더 쉽게 옵션을 다시 확인할 수 있으며 상태 전후의 스크린 샷을 통해 오타로부터 보호합니다. 유용하고 유용한 모든 것들.

두려운 "rm -rf"의 전형적인 경우, 실수로 GUI 나 CLI에서 쉽게 발행 할 수 있다고 생각하십니까?

결국 GUI에 의지하는 것은 부끄러운 일이 아닙니다. 중대한 재난을 막을 수는 없습니다. CLI에서와 마찬가지로 GUI에서도 트리거 행복 할 수 있습니다. 그러나 일단 당신을 저장하면 그 자체로 가치가 입증되었습니다.

4
Maximus Minimus

Rm-rm -i에 앨리어스를 지정하는 대신 remove 또는 saferemove를 알리는 별칭을 사용하는 것이 좋습니다 (및 선호하는 삭제 도구로 사용). 그런 다음이 설정이없는 상자를 사용하면 손상이 발생하지 않습니다.

3
DBMarcos99

상식을 사용하고 이해하지 못하는 명령을 실행하지 마십시오. 이것이 좋은 조언입니다. rm에 전달하는 모든 것의 절대 경로를 작성하거나 Sudo를 통해 무엇이든 실행하는 데 어려움을 겪고 있다면 자유롭게 느끼십시오. 그런 다음 su -c를 선호합니다. 최소한 암호를 캐시하지 않습니다. 암호를 확인하지 않고 루트 권한으로 작업을 수행 할 수있는 일반 사용자에게는 불편하지 않습니다.

~/.bashrc에 넣을 수있는 몇 가지가 있습니다 :

alias srm='rm -i'

당신이 rm의 안전한 대안을 가질 수 있도록 ...

그러나 결국, 당신은 항상 망칠 수 있습니다. 다른 날에는 쓸모없는 구성 스크립트가 전체/usr/bin 폴더를 숨기고 여러 가지를 깨뜨 렸습니다. 예. 버그가있는 모든 유형의 소프트웨어를 간단히 '설치'하면 시스템이 손상 될 수 있습니다. 당신은 당신이 무엇을하든 안전하지 않습니다. 내가 얻는 것은 가장 중요한 것입니다.

정기 백업 유지

3
jns

Bash를 사용하는 경우 다음을 시도하십시오.

TMOUT=600

귀하의 /root/.bashrc 또는 유사합니다. 10 분 후에 자동으로 로그 아웃되므로 실수로 열어 둔 루트 터미널로 넘어 가서 어리석은 것을 입력 할 가능성이 줄어 듭니다.

예, Sudo를 사용하여 루트 명령을 실행해야한다는 것을 알고 있습니다. 언젠가 위험한 게임을하기로 결정한 경우 추가 안전망입니다.

2
Andrew Ferrier

그들이하는 일을 완전히 이해하지 않으면 온라인에서 찾은 명령을 절대로 실행하지 마십시오.

시스템이 포스터와 다를 수 있으며 이로 인해 세상이 다칠 수 있습니다.

2
jjnguy

유닉스/리눅스 관점에서 명령 행 안전을위한 확실한 방법은 루트 계정을 올바르게 사용하는 것입니다.
루트 인 rm -rf는 일반적으로 사용자보다 더 위험하며 루트로 로그인하는 대신 Sudo와 같은 내장 된 것을 사용하는 것이 중요합니다. 좋은 간단한 whoami는 일반적으로 정신 분열증 또는 여러 성격에 도움이 될 것입니다.

특히 파일 변경 명령에 에코를 추가하면, 특히 glob 또는 regex와 일치하는지 확인하려는 경우.

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

Mysql CLI를 사용하는 경우 권장되는 별칭입니다.

2
jldugger

작업중인 컴퓨터에 보조 연결을 사용하면 기본 세션을 종료하거나 대량 처리 등을 잠그는 어리석은 일을 할 때 편리 할 수 ​​있습니다.

이렇게하면 여전히 머신에 액세스 할 수 있으며 기본 세션을 종료 할 수 있습니다.

위의 의견 대부분은 rm을 언급하지만 다른 명령으로 바보 같은 짓을했습니다 ...

ifconfig는 네트워크를 중단 시키려고합니다.

스크립팅에 관해서는 일반적으로 두 개의 창에서 작업합니다. 첫 번째는 스크립트를 작성하는 데 사용하고 두 번째는 각 줄을 작성하면서 테스트합니다. 천천히 조심스럽게 가면서 코드를 작성할 때 예상대로 모든 줄이 작동하는지 확인하고 동일한 변수 등을 유지 관리합니다.

개인적으로, 나는 rm -i 정말 도움이되는 것들에 대한 여분의 프롬프트를 찾지 못했습니다. 피곤하고 스트레스를받을 때 실수를하게됩니다. 어쨌든 y를 부딪 히고 프롬프트를 무시할 때입니다. 아마도 나쁜 습관 일 것입니다.

2
Alex

운영 체제의 여러 변형을 사용하는 경우 구문의 차이점에 대해 매우 알고 있어야합니다. 한 유닉스 변종에서 합리적으로 안전한 것은 다른 유닉스 변종에서 매우 위험합니다.

예 : killall

Linux/FreeBSD/OSX-전달 된 매개 변수와 일치하는 모든 프로세스를 종료합니다. 예 : "killall Apache"는 모든 아파치를 죽이고 다른 모든 프로세스는 그대로 둡니다.

Solaris-all 프로세스를 종료합니다. 아뇨 man page : killall은 shutdown (1M)에서 종료 절차와 직접 관련되지 않은 모든 활성 프로세스를 종료하는 데 사용됩니다.

1
Greg Work

Ls 대신 echo를 사용하므로 Shell이 ​​모든 것을 확장 한 후 전체 명령을 볼 수 있습니다. 또한 파일을 나타내는 변수를 항상 큰 따옴표로 묶어 탭이나 공백이있는 파일 이름으로 작업하십시오.

1
Kyle Brandt

당신이하고있는 일을 생각할 수있는 좋은 방법은 루트의 bashrc (cshrc, 무엇이든)에 다음과 같은 것을 추가하는 것입니다.

unset PATH

그렇게하면 "rm"대신/bin/rm을 수행해야합니다. 그 여분의 캐릭터가 당신을 생각하게 할 것입니다.

1
Bill Weiss

다른 게시물 중 일부에 대한 약간의 메타 : 먼저 제안 된 일반적인 echo/ls 단계를 사용하여 명령이 원하는 파일 세트를 선택하는지 또는 의도 된대로 셸에서 해석 해야하는지 확인합니다.

그러나 이전 명령을 검색하기 위해 셸의 명령 기록 편집 기능을 사용하고 modify 변경해야 할 부분 만 사용합니다.

각 명령을 독립적으로 입력하는 것은 전혀 도움이되지 않습니다 ...

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

... 마지막 줄에 공백을 입력하고 모든 파일을 삭제했기 때문에 ... 나는 항상 이전 줄을 검색하고 단순히 '에코'를 제거합니다.

1
Zac Thompson

복잡한 정규 표현식, 특히 '찾기'명령의 경우 에코를 앞에 놓고 파일로 캡처하십시오. 그런 다음 'source'를 사용하여 파일을 실행하기 전에 생각한 것을 정확히 삭제/이동/등화하고 있는지 확인할 수 있습니다.

정규 표현식이 선택하지 않은 Edge 사례를 수동으로 추가하는 것도 편리합니다.

1
Martin Beckett

루트 사용자 :
필요하지 않으면 루트가 아닙니다.
공급 업체가 루트로 실행해야한다고 말하면 고객이 루트이고 비 루트로 실행하고 싶다고 말합니다.
선반에 "더 쉬워서"루트를 원하는 소프트웨어 패키지는 몇 개입니까?

습관:
'*'를 세 번 보지 않고 remove로 절대 사용하지 마십시오. ls -l TargetPattern을 사용하는 습관을 기르는 것이 가장 좋습니다. 그런 다음 'rm! $'를 사용하십시오. 가장 큰 위협은 당신이 생각하는 곳에 있지 않습니다. I 거의 'ls'만큼 자주 'hostname'을 입력하십시오!

협장:
"alias rm = 'rm -i'"와 같은 별칭과 마찬가지로 표준 프롬프트가 많이 도움이되지만 자주 사용하는 컴퓨터를 완전히 제어 할 수 없으므로 expect 래퍼 스크립트는 '-i'로 경로, 프롬프트 및 별명을 설정하기 만합니다.

문제 찾기 :
전체 경로를 사용하면 도움이되지만 불가능한 경우 더 안전한 위치에 CD를 넣고 '&&'를 사용하여 찾기, 제거, tar, untar 등 :
예 : cd /filesystema && tar cf - | ( cd /filesystemb && tar vxf -)
'&&'를 사용하면이 경우 tar 파일이 자체에서 추출되는 것을 막을 수 있습니다 (이 경우에는 'rsync'가 더 좋습니다).

제거합니다 :
특히 스크립트에서 도움이 될 경우 재귀 적으로 제거하지 마십시오. -type f 및 -name 'pattern'으로 찾기 및 제거 여전히 xargs에 '아무것도'를 먹이지 않을까 두려워 살고 있습니다. tar와 untar는 물건을 움직일 수 있습니다 (대신 rsync 사용)

1
ericslaw

나는 * 가능할 때마다 자체 인수로 사용하십시오. 내가 "이 디렉토리의 모든 것을 제거한다"는 것을 의미한다고해도 나는 더 구체적으로 노력한다. rm *.php. 실수로 다른 디렉토리의 히스토리에서 동일한 명령을 실행하는 경우 선제 적 손상 제어입니다.

1
Annika Backstrom

다음과 같은 경우 :

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

다음과 같이 대체 연산자를 사용할 수 있습니다.
$ ls * .php
<디렉토리>

$ ^ ls ^ echo rm (이전 명령의 ls를 echo rm으로 대체하여 나머지 명령 줄을 동일하게 유지)

$ ^ echo rm ^ rm (echo rm을 rm으로 바꾸면 * .php를 다시 입력하지 않고 잘못된 시간에 공백을 넣을 필요가 없습니다)

^ = shift-6. 익숙하지 않은 사람들을 위해.

0
Red Five

Echo를 사용하여 명령을 실행하는 것이 좋지만 여전히 오타가 발생하기 쉽습니다.

! $와 같은 확장으로 사용하십시오.

echo foo*
rm -rf !$

! $는 마지막 명령의 마지막 단어로 확장되므로 다음과 같습니다.

echo foo*
rm -rf foo*

마지막 명령에 대한 모든 인수로 확장되는! *도 있습니다.

실제로 원하는 경우이 방법으로 할 수 있습니다

echo rm -rf foo*
!*

bash가 아닌 ksh를 사용하는 경우 Esc + 마침표를 입력하여 마지막 Word를 대신 삽입 할 수 있습니다.

0
Mikel

대신에

rm foo*

사용하다

rm -i foo*

이것은 소수의 파일에는 실용적이지만 전체 타르볼에는 적용되지 않습니다. 이것이 rm 앨리어싱이 방해가되는 이유입니다.

0
gbarry

Bash를 사용하고 PS1 = '\ u @\h :\w>'를 설정하십시오. 이것은 username @ hostname :/full/working/directory/path>로 확장됩니다. 다른 답변에서 언급했듯이 .profile 또는 .bash_profile 파일을 업데이트 할 수없는 경우 로그인 할 때마다 환경을 설정할 수 있습니다. 배경색을 바꾸는 것이 가장 쉬운 방법입니다. :-)

0
dr-jan