Как я могу удалить определенную строку из history
базы данных?
linux
bash
history
command-history
w0rldart
источник
источник
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
, например (добавьте, например, в.bashrc
):Это предотвратит добавление в историю любой команды с начальным пробелом. Затем вы можете полностью очистить историю, запустив
источник
Прежде всего, если команда, которую вы собираетесь выдать, чувствительна, небезопасна или вам просто не нужно, чтобы она загромождала вашу историю, лучше всего / быстрее всего просто предотвратить ее попадание в историю. Убедитесь, что
$HISTCONTROL
содержитignorespace
:Затем выполните любую команду, которую вы не хотите в своей истории, пробелом:
Если вы случайно поместили нежелательную команду в историю, при условии, что ваша сессия bash все еще открыта, команда еще не коснулась диска. Чтобы удалить предыдущую команду в истории, выполните:
Обратите внимание на ведущий пробел; эта команда требует
ignorespace
, иначе она просто удалит себя!Если вы хотите удалить последние несколько команд, найдите последний и первый номер истории:
В этом случае 602 и 599. Тогда выдайте:
(Без
ignorespace
этого было бы 603..599.)Если вы не хотите, чтобы какая-либо история из вашего текущего сеанса попала на диск, выйдите, используя:
До сих пор подход заключается в том, чтобы даже не допустить записи чувствительных элементов истории на диск для дополнительной безопасности, потому что теоретически данные, удаленные с энергонезависимого носителя, все еще могут быть восстановлены.
Однако, если команды, которые вы хотите удалить, относятся к предыдущему сеансу, они уже будут добавлены при
$HISTFILE
выходе. Манипулирование истории с вышеупомянутыми командами будет еще только добавить остальные новые детали к$HISTFILE
, на выходе . Для того, чтобы перезаписать$HISTFILE
с учетом текущей сессии по всей истории, прямо сейчас , вопрос:Конечно, для элементов истории, уже находящихся на диске, альтернативой редактированию истории с
history -d
последующими командамиhistory -w
является редактирование$HISTFILE
с помощью текстового редактора.источник
$HISTFILE
, на выходе .» На самом деле, это не совсем верно. Кажется, он только добавляет оставшиеся новые элементы, которые «выпирают» из первоначальной длины истории. Например, если я удаляю 5 оригинальных предметов и добавляю 15 новых, добавляются только последние 10 новых, тогда как я ожидаю, что все 15 новых будут добавлены. Я думаю, что это ошибка, потому что я не вижу, как это всегда желательно функциональность.Несколько техник:
Предотвращение сохранения конфиденциальной информации в файле истории
Если вы ввели какой-либо пароль в командной строке, а затем понимаете, что все команды записываются в журнал, вы можете:
Принудительно завершить текущий сеанс без сохранения истории:
Это отбросит всю текущую историю.
Набирайте ↑ (up arrow)в сеансе open bash, пока не будет отображена конфиденциальная информация, затем с помощью клавиш редактирования строки, таких как Ctrl+, Wудалите конфиденциальную информацию, а затем ↓ (down arrow) до появления новой пустой строки перед вводом Enter.
Удалить конфиденциальную информацию из файла истории
Если вы понимаете, что конфиденциальная информация уже сохранена, и вы хотите удалить ее, но не всю свою историю:
Простая
sed
команда может сделать работу:но, когда вы вводите это, вы создаете другую строку истории, содержащую шаблон поиска (конфиденциальную информацию), который вы пытаетесь удалить. Чтобы вы могли:
Это будет работать
head -n1
с вводом с терминала. Похоже, что ваш терминал завис (не будет подсказки); просто введите информацию, которую вы хотите удалить из файла. Это хитрость, позволяющая вводить (часть) команды без фактического ее ввода в командной строке, что делает ее непригодной для включения в запись истории. Затемsed
будет использовать введенный вами текст для поиска.bash_history
и удаления всех строк, содержащих конфиденциальную информацию. Примечание: если ваш шаблон конфиденциальной информации содержит косую черту (ы), вы должны экранировать их обратной косой чертой или изменитьsed
команду, чтобы использовать этот синтаксис для указания разделителя, который не появляется в шаблоне:Другим способом может быть удаление только конфиденциальной информации, но сохранение команд, содержащих эту информацию. Для этого вы можете просто заменить конфиденциальную информацию заменой текста на ваш выбор:
Удалить конфиденциальную информацию из любого файла в определенном дереве
Наконец, чтобы быть уверенным, что это не останется в другом забытом файле:
перечислит все заинтересованные файлы.
заменит все вхождения конфиденциальной информации во всех файлах в дереве каталогов с корнем в
.
. Примечание: даже если эта команда используетxargs -0
, она не будет обрабатывать файлы с символами новой строки в их именах.источник
Найдите строку, которую хотите удалить, нажимая, ↑ (up arrow)пока она не появится, затем нажмите Ctrl+ U. Это должно удалить линию.
Если вы используете
history
команду, вы увидите, что строка заменена звездочкой.источник
*
.Если вам нужно удалить несколько строк одновременно, я обычно использую это:
Если вам нужно удалить последнюю команду, которую вы можете использовать:
источник
history | grep <string>
все равно показывает все строки, которые, как он утверждал, удалял ...history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
Если вам нужно удалить ряд строк из истории, следующая функция bash может сэкономить вам некоторое время:
Функция обычно должна быть добавлена к
$HOME/.bashrc
. Чтобы использовать эту функцию немедленно, вам понадобится снова прочитать файл с помощью запущенной оболочки (. $HOME/.bashrc
). Затем удалить, например, команды 200-210 из истории:(Примечание. Этот вопрос входит в число самых популярных результатов поиска, если вы ищете удаление ряда команд из истории bash. Поэтому, хотя приведенное выше - больше, чем задает вопрос, оно может быть полезно для некоторых читателей.)
источник
for
заявления:for n in $(seq "$2" "$1")
некоторые стилистически предпочитают, и, еслиseq
не работает, попробуйтеfor ((n="$2"; n>="$1"; n--))
.59 это номер строки. Не может быть ничего слаще этого :)
источник
Просто попробуйте это,
это будет отображать идентификатор истории и команды, например,
использовать,
Здесь 211 - идентификатор истории. Теперь проверьте это с помощью
источник
Я знаю, что прошло много времени с тех пор, как на этот вопрос был задан и дан ответ, но я покажу вам мой метод очистки файла истории и выхода из системы одновременно.
Я бегу :
history -w && nano "${HISTFILE}" && history -c && exit
То, что он делает, просто:
history -w
: пишет кэшированную историю внутри"${HISTFILE}"
nano "${HISTFILE}"
Позвольте мне отредактировать"${HISTFILE}"
Вы можете использовать скрипт Sed или что угодно, чтобы очистить свой"${HISTFILE}"
history -c
: очистить кэшированную историю, поэтому последняя команда не добавляется.exit
: выйти из системы, добавив кешированную историю ... но она пуста;)После этой команды вы выйдете с чистым файлом истории. Войдите, чтобы проверить свою историю;)
Надеюсь, это кому-нибудь поможет.
источник
Вы также можете редактировать файл истории напрямую, например,
nano .bash_history
если вы находитесь в оболочке bash?источник