실수로 bash 명령 줄에 암호를 입력했습니다


189

실수로 암호를 bash 명령 줄에 입력하여 Last login: ...줄을 잘못 입력 했습니다 Wrong password(서둘 렀습니다). 추적을 어떻게 처리합니까?

내가 한 것은 .bash_history문제를 일으키는 행 을 편집 하고 삭제하는 것입니다 (암호를 파일에 표시하기 위해 한 번 다시 로그인해야 삭제 할 수 있으므로 다시 로그인하면 UPARROW 키 아래에서 사용 가능한 기록에서 사라집니다).

명령 기록을 저장할 수있는 다른 장소가 있습니까? 시스템은 CentOS 6.5입니다.


59
그냥 암호를 변경하십시오 :)
gronostaj

96
비밀번호 변경은 그렇게 간단하지 않습니다 ... 관리자에게 15 개의 다른 서버에 새 공개 키를 다시 설치하도록 요청해야합니다 /dev/null.
MaDa

71
언제든지 쉽게 비밀번호를 변경할 수 없으면 심각한 보안 허점이있을 수 있습니다. 누군가가 실제로 암호를 얻으면 어떻게해야합니까? 시스템 액세스를 즉시 취소 할 수단이 있습니까?
gronostaj

42
키를 변경하지 않고 ssh 키의 암호를 변경할 수 있습니다 ssh-keygen -f id_rsa -p.
jwg

6
적어도 네트워크로 연결된 Windows 로그인 하에서는 문제가 발생할 수 있습니다. 관리자 (고급 서버 타워)의 기본값은 모든 로그인 시도를 기록하는 것이며, 물론 사용자 이름은 일반 텍스트입니다. 진취적인 사람은 사용자 이름이 아닌 문자열을 검색하여 유효한 다음 사용자 이름 (또는 동일한 컴퓨터에서 다음 로그인 시도)과 상관 관계를 갖습니다. 해당 관리 로그 파일을 삭제하는 간단한 방법은 없습니다. 나중에 비밀번호를 변경해야합니다.
Carl Witthoft

답변:


184

bash전체 기록을 지우는 대신의 기록 에서 문제가되는 행만 제거 할 수 있습니다 . -d플래그가 있는 행을 제거한 다음 플래그를 사용하여 새 히스토리를 저장 (쓰기)하십시오 -w.

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w

1
"PROMPT_COMMAND = history -a"를 설정 한 경우 작동하지 않습니다. 이를 사용하면 명령이 종료 된 후 프롬프트가 표시되면 비밀번호가 포함 된 명령이 즉시 .bash_history에 기록됩니다. .bash_history를 편집하여 제거해야합니다.
benrifkah

1
또한 줄이 hostory 파일에 쓰여지고 나중에 여러 개의 셸 (터미널 창)이 열린 경우 해당 셸의 모든 기록이 기록됩니다! 모든 쉘에서 제거하거나 최소한 닫은 히스토리 LAST 쉘에서 제거해야합니다! 그것을 사용한 쉘보다 먼저 얻는 것이 좋습니다. 여러 껍질을 다룰 때의 역사는 악몽이 될 수 있습니다.
안토니

121

여기에는 두 부분이 있습니다.

  • bash~/.bash_history기본적으로 세션이 끝날 때 기록되는 파일에 기록을 저장합니다.
  • history기억에 유지

안전을 위해 세션에서 삭제해야합니다.

history -c

필요에 따라 히스토리 파일을 자릅니다.

> ~/.bash_history

비밀번호를 입력 한 세션이 여전히 열려있는 경우 추적 을 처리하는 다른 방법 은 세션이 종료 될 때 HISTFILE히스토리가 기록되지 않도록 변수를 널 디바이스 로 설정하는 것입니다 ~/.bash_history.

export HISTFILE=/dev/null

205
이봐, 관리자 야!
Raystafarian

5
Pun은 의도하지 않았습니다. 죄송합니다 :) 내 의견을 쓸 때 당신의 닉을 보지 못했습니다.
MaDa

7
편집증이 되려면 (여전히 어떤 이유로 든 암호를 변경하지 마십시오) shred파일을 여러 번 덮어 쓰지 않아야 합니까?
kojiro

1
@MaDa 문제 없습니다. 답에 또 다른 방법을 추가하여 내 닉을 그림으로 가져 왔습니다.
devnull

5
설정 HISTFILE=이 충분합니다. From bash(1): 설정하지 않으면 쉘이 종료 될 때 명령 기록이 저장되지 않습니다.
Lekensteyn

23

bash (적어도 내가 알고있는 모든 기록 및 현재 버전)는 종료 할 때까지 기록을 자동으로 저장하지 않기 때문에 절대 저장되지 않도록 명령을 입력 할 때 일반적으로 적용 가능한 전략은 즉시 입력하는 것입니다.

kill -9 $$

이렇게하면을 (를) SIGKILL붙잡을 수없는 셸이 종료되므로 셸은 종료시 아무것도 저장할 수 없습니다.

대부분의 다른 접근 방식은 사실 이후 (즉, 데이터가 이미 디스크에 닿은 후) 스크러빙을 포함하며, 특히 시스템에서 btrfs 또는 이와 유사한 것을 사용하는 경우 오류 가능성이 더 높습니다 (사본 누락).


2
+1, 더 많은 오류 가능성뿐만 아니라, 그 후 얼마나 많은 명령이 실행되었는지에 따라 복구 가능할 수도 있습니다
Cruncher

"자동"이라는 단어가 없습니까? dotancohen은 쉘을 종료하지 않고 기록을 저장하는 방법을 보여 주었기 때문입니다.
Ben Voigt

3
종료시 각 명령이 실행 된 후 히스토리를 저장하도록 쉘을 구성 할 수 있습니다.
Nick Matteo

1
+1 이것은 내가 추천하고 싶은 바로 그 것입니다! rm ~/.bash_history~OP 파일이 이미 저장된 경우 백업 파일을 제거하는 것 외에도
Tomas

"PROMPT_COMMAND = history -a"를 설정 한 경우 작동하지 않습니다. 이를 사용하면 명령이 종료 된 후 프롬프트가 표시되면 비밀번호가 포함 된 명령이 즉시 .bash_history에 기록됩니다. .bash_history를 편집하여 제거해야합니다.
benrifkah

11

실수로 기록에 저장하지 않으려는 것을 입력 한 후 다음을 입력 할 수 있습니다. unset HISTFILE

Bash는 로그 오프 할 때 히스토리를 저장할 위치를 알지 못하므로 효과적으로 전체 세션에 대한 히스토리 로깅을 비활성화합니다.


"PROMPT_COMMAND = history -a"를 설정 한 경우 작동하지 않습니다. 이를 사용하면 명령이 종료 된 후 프롬프트가 표시되면 비밀번호가 포함 된 명령이 즉시 .bash_history에 기록됩니다. .bash_history를 편집하여 제거해야합니다.
benrifkah

11

내가 가장 좋아하는 요령은 위쪽 화살표, 명령에 대한 백 스페이스를 누르고, 무언가를 입력하고 (필요하지 않을 수도 있음) 아래쪽 화살표를 누르고, "ls"를 입력하고 Enter 키를 누르는 것입니다. 정말 하키 느낌이지만 실제로 작동합니다. 내 기록에서 잘못된 명령을 편집 한 후 ctrl-c를 쳐서 편집을 중단하지 않고 망쳐 놓은 후 화가 나면 이것을 발견했습니다. bash가 개정주의 이력을 지원한다고 생각합니다. ;-)

$ passw0rd
$ <up arrow><backspace x8>cd<down arrow>echo hi
$ history|tail -3

다음과 같습니다.

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 

그건 이상한 . 한 가지 단점은 편집 한 히스토리를 알고있는 것 같습니다. 따라서 이전 버전을 복원 할 수있는 방법이 있습니까?
MadTux

@MadTux-완전히 .bash_history는 단순한 텍스트 파일입니다. 따라서 위의 예를 수행하고 종료 한 후 다시 연결할 수 있습니다. .bash_history 파일의 전체 내용을 볼 때 "cd"를 실행했을 때와 다른 점이 없으므로 트레일이 깨끗합니다.
Mark Jerde

"PROMPT_COMMAND = history -a"를 설정 한 경우 작동하지 않습니다. 이를 사용하면 명령이 종료 된 후 프롬프트가 표시되면 비밀번호가 포함 된 명령이 즉시 .bash_history에 기록됩니다. .bash_history를 편집하여 제거해야합니다.
benrifkah

10

다른 답변 외에도 비밀번호가 터미널 스크롤 버퍼 (표시 된 텍스트의 기록)에서 발견되고 터미널 에뮬레이터가 저장 한 경우 하드 디스크에서 더 많은 문제가 발생할 수 있습니다 디스크에 기록. 이것은 KDE konsole에서 발생합니다. 히스토리 크기가 "무제한 스크롤 백"으로 설정되어 출력을 버리지 않습니다.


6

을 사용 $<space> command하면 명령이 기록에 추가되지 않고 때로는 유용합니다

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep

2
흥미롭지 만 설명 된 시나리오에서 이것이 유용한 지 확실하지 않습니다. 모든 비밀번호는 공백으로 시작해야한다고 제안하고 있습니까?
벤 Voigt

1
아니, 그가 제안하는 것은 당신이 역사에 헌신하고 싶지 않은 당신이 입력하는 모든 줄은 선행 공간으로 입력되어야한다는 것입니다. 예 : "ls"는 "ls"가되고 해당 행은 기록 또는 세션 위쪽 화살표 목록에 표시되지 않습니다.
Bryan C.

4
이 선행 공간 트릭은 $ HISTCONTROL에 ignorespace가 포함 된 경우에만 작동합니다.
Bernd Jendrissek 1

2
@ jris198944 명령 줄 인수를 통해 암호를 제공하면 시스템을 실행하는 모든 사람에게 암호가 노출 될 수 있습니다 ps.
jamesdlin

2
어쨌든,이 트릭은 미리 계획하는 경우 유용하지만 누군가 실수 로 명령 줄에 암호를 입력 한 원래 시나리오에는 도움이되지 않습니다 .
jamesdlin

4

히스토리 파일에 저장하지 않는 또 다른 방법은 (로그 아웃하기 전에) 단순히

chmod 400 ~/.bash_history 

그런 다음 로그 아웃하십시오. 전체 bash 세션이 삭제되고 이전 히스토리가 유지되도록 파일에 히스토리 작성을 중지하십시오 (파일이 읽기 전용이므로).

다시 로그인하고 권한을 재설정하십시오 600(또는 편집증의 정도에 따라 다릅니다!).


1

반복해서 언급 된 것을 본다

"PROMPT_COMMAND = history -a"[..]를 설정 한 경우에는 작동하지 않습니다. .bash_history를 편집하여 제거해야합니다.

첫 번째 부분은 사실이지만 .bash_history를 수동으로 편집하여 수정할 필요는 없습니다. 두 명령을 한 줄에 결합하면 완벽하게 작동합니다.

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w

이 방법이 정확히 작동하는 이유를 설명해 주시겠습니까?
Kamil Maciorowski

PROMPT_COMMAND는 다음 명령 프롬프트를 표시하기 전에 만 실행됩니다. 별도의 행에 -d 및 -w 명령을 입력 할 때 문제는 PROMPT_COMMAND가 그 사이에 history -a 명령을 실행한다는 것입니다. 하나의 명령 줄에서 -d와 -w를 모두 실행하면 이후에만 실행됩니다.
Floris Kruisselbrink

0

여기의 많은 답변은 문제의 명령을 현재 bash 세션의 기록에서 기록하기 전에 제거하려고 시도합니다 $HISTFILE(기본적으로 ~ / .bash_history). 그러나 PROMPT_COMMAND=history -a 암호를 설정 한 명령 $HISTFILE은 명령이 종료 된 후 프롬프트가 표시 될 때 즉시 기록 됩니다. $HISTFILE제거 하려면를 편집해야 합니다.

이 설정은 일반적으로 여러 개의 열린 bash 세션에서 명령인터리브 하는 데 사용됩니다 .


-3

syslog 로그도 확인하려고합니다. 유효하지 않은 로그인은 일반적으로 syslog에 기록됩니다.

/ var / log / messages 또는 해당 OS에 해당하는 항목


1
문제는 그가 틀린 암호를 입력 한 것이 아니라 이미 로그인하여 프롬프트에 암호를 입력 한 후 Enter 키를 누르는 것입니다. 메시지 파일에는 표시되지 않습니다.
MaQleod
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.