Bash 기록 파일에서 특정 줄을 제거하십시오. 줄을 어떻게 제거 합니까?

history의 데이터베이스 에서 특정 줄을 어떻게 제거 합니까?



답변

history -a현재 기록이 디스크에 커밋되도록 로그 아웃했다가 다시 로그인하거나 실행 해야합니다.

그런 다음 파일을 편집하십시오 ~/.bash_history.


답변

다음 두 단계로 명령 행을 사용하여 히스토리 파일에서 제거 할 수 있습니다.

  1. 입력 history -d <line_number>하면 메모리의 기록에서 지정된 행이 삭제됩니다.
  2. 입력 history -w하면 현재 메모리 내 기록이 ~/.bash_history파일에 기록 됩니다.

두 단계는 메모리 내 히스토리.bash_history 파일에서도 라인을 영구적으로 제거합니다 .


답변

명령이 먼저 히스토리에 추가 되지 않도록 하려면 환경 변수 HISTCONTROL가 콜론으로 구분 된 값 사이에 값을 포함 하는지 확인하십시오 ignorespace(예 :에 추가 .bashrc).

$ export HISTCONTROL=ignorespace

이렇게하면 선행 공백이있는 명령이 기록에 추가되지 않습니다. 그런 다음 실행하여 기록을 완전히 지울 수 있습니다.

$  history -c -w
  ^-- additional space character


답변

우선, 발행하려는 명령이 민감하거나 안전하지 않거나, 당신의 역사를 혼란스럽게 만들 필요가 없다면, 처음부터 역사에 들어가는 것을 막는 것이 가장 좋습니다. 다음이 $HISTCONTROL포함되어 있는지 확인하십시오 ignorespace.

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

그런 다음 역사에서 원하지 않는 명령을 공백으로 진행하십시오.

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

bash 세션이 여전히 열려 있으면 원하지 않는 명령을 기록에 실수로 넣은 경우 명령이 디스크에 아직 닿지 않았습니다. 히스토리에서 이전 명령을 삭제하려면 다음을 실행하십시오.

(bash)$  history -d $((HISTCMD-1))

선행 공간에 유의하십시오. 이 명령은을 요구합니다 ignorespace. 그렇지 않으면 그냥 삭제됩니다!

마지막 몇 개의 명령을 삭제하려면 마지막 기록 번호와 첫 번째 기록 번호를 찾으십시오.

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

이 경우 602와 599입니다. 다음을 발행하십시오.

(bash)$  for i in {602..599}; do history -d $i; done

(가 없으면 ignorespace603..599입니다.)

당신이 원하지 않는 경우 어떤 디스크를 칠 현재 세션에서 역사를 종료 사용 :

(bash)$ kill -9 $$

이론적으로는 비 휘발성 미디어에서 삭제 된 데이터를 복구 할 수 있기 때문에 지금까지의 접근 방식은 보안을 강화하기 위해 민감한 기록 항목을 디스크에 쓰지 못하게하는 것입니다.

그러나 제거하려는 명령이 이전 세션에있는 경우 이미 종료시 추가되었습니다 $HISTFILE. 위의 명령으로 역사를 조작하는 것은 여전히 것입니다 추가 나머지 받는 항목을 $HISTFILE, 종료시 . 하려면 덮어$HISTFILE의 현재 세션의 견해와 전체 역사, 현재 , 문제 :

(bash)$  history -w

물론 디스크에 이미 기록 항목이있는 경우 history -d명령을 사용하여 기록을 편집하는 대신 텍스트 편집기를 사용 history -w하여 편집 할 수 $HISTFILE있습니다.


답변

몇 가지 기술 :

중요한 정보가 기록 파일에 저장되지 않도록 방지

명령 행에 암호를 입력 한 경우 모든 명령이 기록되었음을 알 수 있습니다.

  1. 히스토리를 저장하지 않고 현재 세션을 강제 종료하십시오.

     kill -9 $$

    모든 현재 기록이 삭제됩니다.

  2. 유형 ↑ (up arrow)민감한 정보까지 오픈 bash는 세션에서 다음과 같은 행 편집 키를 사용하여 표시됩니다 Ctrl+ W민감한 정보를 삭제하고, 다음 ↓ (down arrow) 비어있는 새 라인은 메시지가 표시 될 때까지 이전에 입력 Enter.

히스토리 파일에서 민감한 정보 삭제

중요한 정보가 이미 저장되어 있고 전체 기록이 아닌 삭제하려는 경우 :

간단한 sed명령으로 작업을 수행 할 수 있습니다.

sed -e '/SeNsItIvE InFo/d' -i .bash_history

그러나이 정보를 입력하면 삭제하려는 검색 패턴 (민감한 정보)이 포함 된 다른 히스토리 라인이 작성됩니다. 그래서 당신은 할 수 있습니다 :

sed -e "/$(head -n1)/d" -i .bash_history

이것은 head -n1터미널의 입력으로 실행 됩니다. 터미널이 정지 된 것으로 보입니다 (프롬프트가 표시되지 않음). 파일에서 삭제하려는 정보를 입력하십시오. 이것은 실제로 명령 줄에 명령을 입력하지 않고 명령을 입력 (일부) 할 수있게하여 기록 기록에 포함시킬 수없는 방법입니다. 그런 다음 sed입력 한 텍스트를 사용 .bash_history
하여 중요한 정보가 포함 된 모든 줄 을 검색 하고 삭제합니다. 참고 : 민감한 정보 패턴에 슬래시가 포함되어 있으면 백 슬래시로 이스케이프하거나이 sed구문을 사용하여 패턴에 나타나지 않는 구분자를 지정하도록 명령을 변경 해야합니다.

sed -e "\|$(head -n1)|d" -i .bash_history

다른 방법은 중요한 정보 만 삭제하고 정보가 포함 된 명령을 유지하는 것입니다. 이를 위해 민감한 정보를 원하는 대체 텍스트로 간단히 대체 할 수 있습니다.

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

특정 트리의 모든 파일에서 중요한 정보를 삭제합니다

마지막으로, 이것이 잊어 버린 다른 파일에 남아 있지 않도록 확인하십시오 .

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

관련된 모든 파일을 나열합니다.

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \\n \\0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

는 루트 디렉토리에있는 모든 파일에서 중요한 정보를 모두 대체합니다 .. 참고 :이 명령은을 사용하더라도 xargs -0이름에 줄 바꿈이있는 파일은 처리하지 않습니다.


답변

삭제할 줄이 ↑ (up arrow)나타날 때 까지을 눌러 찾은 다음 Ctrl+ 를 누릅니다 U. 그 줄을 제거해야합니다.

history명령 을 사용하면 행이 별표로 대체 된 것을 볼 수 있습니다.


답변

동시에 여러 줄을 제거 해야하는 경우 일반적으로 다음을 사용합니다.

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

마지막 명령을 제거해야 할 경우 다음을 사용할 수 있습니다.

history -d $((HISTCMD-2))