
Как удалить определенную строку из history
базы данных?
решение1
Вам необходимо выйти из системы и войти снова или запустить ее, history -a
чтобы сохранить текущую историю на диске.
Затем просто отредактируйте файл ~/.bash_history
.
решение2
Удаление из файла истории можно выполнить с помощью командной строки в два этапа:
- Ввод текста
history -d <line_number>
удаляет указанную строку из истории в памяти. - При вводе текста
history -w
текущая история, хранящаяся в памяти, записывается в~/.bash_history
файл.
Эти два шага вместе навсегда удаляют строку из памяти.историяи из.bash_historyфайл также.
решение3
КпредотвращатьЧтобы команда не была добавлена в историю в первую очередь, убедитесь, что переменная окружения HISTCONTROL
содержит среди своих значений, разделенных двоеточием, значение ignorespace
, например (добавьте eg к .bashrc
):
$ export HISTCONTROL=ignorespace
Это предотвратит добавление в историю любой команды с начальным пробелом. Затем вы можете полностью очистить историю, выполнив команду
$ history -c -w
^-- additional space character
решение4
Несколько методик:
Предотвратить сохранение конфиденциальной информации в файле истории
Если вы ввели какой-то пароль в командной строке и понимаете, что все команды регистрируются, вы можете:
Принудительно выйти из текущего сеанса без сохранения истории:
kill -9 $$
Это приведет к удалению всей текущей истории.
Как правильно заметилS0AndS0'комментарий, другой способ - изменитьимя файла истории:
HISTFILE=
Введите текст ↑ (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 -lZ "$SENSITIVEINFO" |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
заменит все вхождения конфиденциальной информации во всех файлах в дереве каталогов с корнем .
. Примечание: несмотря на то, что эта команда использует xargs -0
, она не будет обрабатывать файлы с символами новой строки в именах.