답변:
history -a
현재 기록이 디스크에 커밋되도록 로그 아웃했다가 다시 로그인하거나 실행 해야합니다.
그런 다음 파일을 편집하십시오 ~/.bash_history
.
vim ~/.bash_history
공백으로 명령을 시작하십시오 (예 :) . 공백으로 시작하는 명령은 일반적으로 기록되지 않습니다 (참조 $HISTCONTROL
).
다음 두 단계로 명령 행을 사용하여 히스토리 파일에서 제거 할 수 있습니다.
history -d <line_number>
하면 메모리의 기록에서 지정된 행이 삭제됩니다.history -w
하면 현재 메모리 내 기록이 ~/.bash_history
파일에 기록 됩니다.두 단계는 메모리 내 히스토리 와 .bash_history 파일에서도 라인을 영구적으로 제거합니다 .
history -w
역사 에서 마지막을 삭제하는 방법 ?
<line_number>
단지 history | grep [unwanted_content]
모든 라인을 포함하여 목록을 얻으려면 [unwanted_content]
(암호와 같은).
우선, 발행하려는 명령이 민감하거나 안전하지 않거나, 당신의 역사를 혼란스럽게 만들 필요가 없다면, 처음부터 역사에 들어가는 것을 막는 것이 가장 좋습니다. 다음이 $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
있습니다.
$HISTFILE
, 종료시 ."사실,이 정확히 사실이 아니다. 원래 기록 길이에서 '고착 된'남은 새 항목 만 추가하는 것 같습니다. 예를 들어 5 개의 원본 항목을 제거하고 15 개의 새로운 항목을 추가하면 마지막 10 개의 새로운 항목 만 추가되지만 15 개의 새로운 항목이 모두 추가 될 것으로 예상됩니다. 이것이 어떻게 바람직한 기능인지 알 수 없기 때문에 이것이 버그라고 생각합니다.
몇 가지 기술 :
명령 행에 암호를 입력 한 경우 모든 명령이 기록되었음을 알 수 있습니다.
히스토리를 저장하지 않고 현재 세션을 강제 종료하십시오.
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))
history | grep <string>
여전히 ... 그것을 삭제 주장 모든 라인을 보여줍니다
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
히스토리에서 여러 줄을 제거해야하는 경우 다음 bash 함수를 사용하면 시간을 절약 할 수 있습니다.
function histdel() {
[ $# -eq 1 ] && history -d "$1" && history -w
if [ $# -eq 2 -a "$1" -le "$2" ]; then
for n in `seq "$2" "$1"`; do
history -d "$n"
done
history -w
fi
}
기능은 일반적으로에 추가해야합니다 $HOME/.bashrc
. 이 기능을 즉시 사용하려면 실행중인 쉘 ( . $HOME/.bashrc
) 이 파일을 다시 읽도록해야합니다 . 그런 다음 히스토리에서 명령 200-210을 삭제하려면 다음을 수행하십시오.
$ histdel 200 210
(참고 : bash history에서 다양한 명령을 삭제하면이 질문은 가장 많이 검색되는 결과 중 하나입니다. 따라서 위의 내용은 질문에서 요구하는 것 이상이지만 일부 독자에게는 유용 할 수 있습니다.)
for
진술의 대안 양식 : for n in $(seq "$2" "$1")
일부는 문체 적으로 선호하며 seq
작동하지 않으면을 시도하십시오 for ((n="$2"; n>="$1"; n--))
.
이것들을 시도해보십시오.
$ history
이것은 히스토리의 ID와 명령을 표시합니다.
.
.
211 LS
212 javac Welcome.java
213 자바 환영
.
.
사용하다,
$ history -d 211
여기서 211은 역사의 id입니다. 이제 이것을 사용하여 확인하십시오.
$ history
.
.
211 javac Welcome.java
212 자바 환영
.
.
이 질문에 대한 답변을받은 지 오랜 시간이 걸렸지 만 내 기록 파일을 정리하고 동시에 로그 아웃하는 방법을 보여 드리겠습니다.
난 달린다 :
history -w && nano "${HISTFILE}" && history -c && exit
그것이하는 일은 간단합니다.
history -w
: 캐시 된 기록을 내부에 기록 "${HISTFILE}"
nano "${HISTFILE}"
: 편집 "${HISTFILE}"
할 수 있습니다. sed 스크립트를 사용하거나 원하는 것을 정리할 수 있습니다."${HISTFILE}"
history -c
: 캐시 된 히스토리를 지우면이 마지막 명령이 추가되지 않습니다.exit
: 캐시 된 기록을 추가하여 로그 아웃하십시오 ...하지만 비어 있습니다.)해당 명령이 끝나면 클린 히스토리 파일로 로그 아웃됩니다. 역사를 확인하려면 로그인하십시오;)
이것이 누군가를 도울 수 있기를 바랍니다.