history
의 데이터베이스 에서 특정 줄을 어떻게 제거 합니까?
답변
history -a
현재 기록이 디스크에 커밋되도록 로그 아웃했다가 다시 로그인하거나 실행 해야합니다.
그런 다음 파일을 편집하십시오 ~/.bash_history
.
답변
다음 두 단계로 명령 행을 사용하여 히스토리 파일에서 제거 할 수 있습니다.
- 입력
history -d <line_number>
하면 메모리의 기록에서 지정된 행이 삭제됩니다. - 입력
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
(가 없으면 ignorespace
603..599입니다.)
당신이 원하지 않는 경우 어떤 디스크를 칠 현재 세션에서 역사를 종료 사용 :
(bash)$ kill -9 $$
이론적으로는 비 휘발성 미디어에서 삭제 된 데이터를 복구 할 수 있기 때문에 지금까지의 접근 방식은 보안을 강화하기 위해 민감한 기록 항목을 디스크에 쓰지 못하게하는 것입니다.
그러나 제거하려는 명령이 이전 세션에있는 경우 이미 종료시 추가되었습니다 $HISTFILE
. 위의 명령으로 역사를 조작하는 것은 여전히 것입니다 추가 나머지 새 받는 항목을 $HISTFILE
, 종료시 . 하려면 덮어 을 $HISTFILE
의 현재 세션의 견해와 전체 역사, 현재 , 문제 :
(bash)$ history -w
물론 디스크에 이미 기록 항목이있는 경우 history -d
명령을 사용하여 기록을 편집하는 대신 텍스트 편집기를 사용 history -w
하여 편집 할 수 $HISTFILE
있습니다.
답변
몇 가지 기술 :
중요한 정보가 기록 파일에 저장되지 않도록 방지
명령 행에 암호를 입력 한 경우 모든 명령이 기록되었음을 알 수 있습니다.
-
히스토리를 저장하지 않고 현재 세션을 강제 종료하십시오.
kill -9 $$
모든 현재 기록이 삭제됩니다.
-
유형 ↑ (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))