Как я могу удалить определенную строку из базы данных history
?
12 ответов
Вы можете добиться удаления из файла истории с помощью командной строки в два этапа:
- Набор
history -d <line_number>
удаляет указанную строку из истории в памяти. - Ввод
history -w
записывает текущую историю в памяти в файл~/.bash_history
.
Два шага вместе навсегда удаляют строку из истории в памяти, а также из файла .bash_history .
Вы должны выйти из системы и снова войти или запустить history -a
чтобы текущая история была сохранена на диске.
Затем просто отредактируйте файл ~/.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 $$
Это отбросит всю текущую историю.
Введите ↑ (стрелка вверх) в открытом сеансе bash, пока не отобразится конфиденциальная информация, затем с помощью клавиш редактирования строки, например Ctrl+W, удалите конфиденциальную информацию, а затем ↓ (стрелка вниз) до появления новой пустой строки перед вводом Введите
Удалить конфиденциальную информацию из файла истории
Если вы понимаете, что конфиденциальная информация уже сохранена, и вы хотите удалить ее, но не всю свою историю:
Простая команда 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
, она не будет обрабатывать файлы с символами новой строки в их именах.
Найдите строку, которую хотите удалить, нажимая ↑ (стрелка вверх), пока она не появится, затем нажмите Ctrl+U. Это должно удалить линию.
Если вы используете команду history
, вы увидите, что строка была заменена звездочкой.
Если вам нужно удалить несколько строк одновременно, я обычно использую это:
history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
Если вам нужно удалить последнюю команду, которую вы можете использовать:
history -d $((HISTCMD-2))
history | sed -i 59d
59 это номер строки. Не может быть ничего слаще этого :)
Просто попробуйте это,
$ history
это будет отображать идентификатор истории и команды, например,
,
,
211 лс
212 javac Welcome.java
213 Java Добро пожаловать
,
,
использовать,
$ history -d 211
Здесь 211 - идентификатор истории. Теперь проверьте это с помощью
$ history
,
,
211 javac Welcome.java
212 Java Добро пожаловать
,
,
Если вам нужно удалить ряд строк из истории, следующая функция 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 -w && nano "${HISTFILE}" && history -c && exit
То, что он делает, просто:
history -w
: записывает кэшированную историю внутри"${HISTFILE}"
nano "${HISTFILE}"
: разрешите мне редактировать"${HISTFILE}"
Вы можете использовать скрипт sed или что угодно, чтобы очистить свой"${HISTFILE}"
history -c
: очистить кэшированную историю, поэтому последняя команда не добавляется.exit
: выйти из системы, добавив кешированную историю ... но она пуста;)
После этой команды вы выйдете с чистым файлом истории. Войдите, чтобы проверить свою историю;)
Надеюсь, это кому-нибудь поможет.
Вы также можете редактировать файл истории напрямую, например, nano .bash_history
если вы находитесь в оболочке bash?