Удалить определённую строку из файла истории Bash.
Как удалить определенную строку из базы данных history
?
Как удалить определенную строку из базы данных history
?
Вы можете добиться удаления из файла истории с помощью командной строки в два этапа:
history -d <line_number>
удаляет указанную строку из истории в памяти. history -w
текущая история в памяти записывается в файл ~/.bash_history
. Эти два шага вместе удаляют строку навсегда из памяти history, а также из файла .bash_history.
Для prevent команды от добавления в историю, убедитесь, что переменная окружения 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)$ history -d $((HISTCMD-1))
Заметьте лидирующее место; эта команда требует ignorespace
, иначе она просто удалит сама себя!
Если вы хотите удалить последние несколько команд, найдите последний и первый номер истории:
(bash)$ history 5
598 ok
599 sensitive
600 unsafe
601 doesn
В данном случае 602 и 599. Тогда проблема:
(bash)$ for i in {602..599}; do history -d $i; done “`
(Без ignorespace
это было бы 603…599.)
Если вы не хотите, чтобы any история из вашей текущей сессии попала на диск, выйдите используя:
(bash)$ kill -9 $$
Пока что подход заключается в том, чтобы не допускать даже записи конфиденциальных элементов истории на диск для дополнительной безопасности, поскольку теоретически данные, удаленные с энергонезависимых носителей, все равно могут быть восстановлены.
Если, однако, команда(ы), которые вы хотите удалить, были из предыдущего сеанса, они уже были добавлены к $HISTFILE
при выходе. Манипулирование историей с помощью вышеуказанных команд все равно будет только приложить оставшиеся new элементы к $HISTFILE
, on exit. Для overwrite the $HISTFILE
с представлением текущей сессии истории entire, _ straight now_, выдаёт:
(bash)$ history -w
Конечно, для элементов истории, уже находящихся на диске, альтернативой редактирования истории командами history -d
, а затем выдачей history -w
, является редактирование истории $HISTFILE
с помощью текстового редактора.t-work
602 otherwise-unwanted
”`
В данном случае 602 и 599. Тогда проблема:
0x1&
(Без 0x6& это было бы 603…599.)
Если вы не хотите, чтобы any история из вашей текущей сессии попала на диск, выйдите используя:
0x1&
Пока что подход заключается в том, чтобы не допускать даже записи конфиденциальных элементов истории на диск для дополнительной безопасности, поскольку теоретически данные, удаленные с энергонезависимых носителей, все равно могут быть восстановлены.
Если, однако, команда(ы), которые вы хотите удалить, были из предыдущего сеанса, они уже были добавлены к 0x6& при выходе. Манипулирование историей с помощью вышеуказанных команд все равно будет только приложить оставшиеся new элементы к 0x6&, on exit. Для overwrite the 0x6& с представлением текущей сессии истории entire, _ straight now_, выдаёт:
0x1&
Конечно, для элементов истории, уже находящихся на диске, альтернативой редактирования истории командами 0x6&, а затем выдачей 0x6&, является редактирование истории 0x6& с помощью текстового редактора.
Несколько техник:
Если вы ввели какой-то пароль в командной строке, то осознайте, что все команды записываются в журнал, вы тоже могли бы это сделать:
Принудительно выйти из текущей сессии без сохранения истории:
Введите ↑ (стрелка вверх) в открытой сессии бэша, пока не появится чувствительная информация, затем используйте клавиши редактирования строки, такие как Ctrl+W для удаления чувствительной информации, и then ↓ (стрелка вниз), пока не появится новая пустая строка, перед вводом Enter.
Если вы понимаете, что чувствительная информация уже хранится, и хотите ее удалить, но не всю историю:
Простая команда sed
может выполнить эту задачу:
sed -e '/SeNsItIvE InFo/d' -i .bash_history
, но по мере ввода вы создаете другую строку истории, содержащую шаблон поиска (sensitive info), который вы пытаетесь удалить. Так что вы можете:
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.
Наконец, чтобы быть уверенным, что она не останется в файле another forgotten:
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
, она не будет обрабатывать файлы с новыми строками в их именах.
Найдите удаляемую строку нажатием ↑ (стрелка вверх) пока она не появится, затем нажмите Ctrl+U. Это должно удалить строку.
Если вы используете команду history
, то увидите, что строка подставлена звездочкой.
Если вам нужно удалить ряд строк из истории, следующая функция 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
. Чтобы использовать функцию imediatelly, вам нужно, чтобы файл был снова прочитан запущенной оболочкой (. $HOME/.bashrc
). Затем удалить, например, команды 200-210 из истории:
$ histdel 200 210
(Примечание: Этот вопрос входит в число лучших результатов поиска, если вы ищете удаление ряда команд из истории bash. Таким образом, несмотря на то, что вышеприведенный вопрос больше, чем просто вопрос, он может быть полезен для некоторых читателей).
Просто попробуйте эти,
$ history
Это отобразит id истории и команды, например,
. . 211 ls 212 javac Welcome.java 213 java приветствовать . .
использовать,
$ history -d 211
Здесь 211 - это id истории. Теперь проверьте это, используя
$ history
. . 211 javac Welcome.java 212 java welcome . . .
Я знаю, что прошло много времени с тех пор, как этот вопрос был задан и на него был дан ответ, но я покажу вам свой метод очистки моего файла истории и выхода из системы одновременно.
Я выполняю :history -w && nano "${HISTFILE}" && history -c && exit
Все просто:
history -w
: записывает историю кэширования внутри "${HISTFILE}"
nano "${HISTFILE}"
: позвольте мне отредактировать "${HISTFILE}"
Вы можете использовать скрипт sed или что угодно, чтобы очистить ваши "${HISTFILE}"
history -c
: очистите историю кэширования, чтобы последняя команда не была добавлена. exit
: выведите меня из приложения к истории кэширования… но она пуста ;) После этой команды вы выйдете из системы с чистым файлом истории. Войдите, чтобы проверить свою историю ;)
Надеюсь, это кому-нибудь поможет.