Вопрос или проблема
Есть ли способ не добавлять команду в вашу историю? У меня есть команда, которую я хочу исключить из своего файла истории, и мне действительно не хочется, чтобы она там была, когда я ищу историю, хранящуюся в памяти, хотя это менее важно. Есть ли способ этого избежать, или мне просто нужно вернуться и отредактировать файл истории.
обновление: Я не знал, что это может быть специфично для оболочки. Моя оболочка — zsh
. Вы можете создать ответ для других оболочек, чтобы люди знали, как это сделать в своей оболочке.
В ZSH:
Сначала вставьте setopt HIST_IGNORE_SPACE
в ваш ~/.zshrc
. Теперь после повторного входа в систему вы можете добавлять пробел в начале любой команды, которую не хотите сохранять в истории. Обратите внимание, что (в отличие от одноименного параметра bash) команда остается в внутренней истории до тех пор, пока не будет введена следующая команда, что позволяет вам кратковременно повторно использовать или редактировать строку.
Из руководства пользователя, следующие 3 параметра можно использовать для того, чтобы определенные строки не попадали в историю:
- HIST_IGNORE_SPACE не сохранять команды с префиксом пробела
- HIST_NO_STORE не сохранять команду history (fc -l)
- HIST_NO_FUNCTIONS не сохранять определения функций
Если вы выполняете команду снова и снова, возможно, вам стоит использовать функцию игнорирования истории вашей оболочки. Допустим, у вас есть secret.server.com, к которому вы подключаетесь по ssh, передаете файлы по FTP и т.д., но вы не хотите, чтобы какая-либо строка, упоминающая secret.server.com, была сохранена:
В bash
вы бы настроили
HISTIGNORE="*secret.server.com*"
а в zsh
параметр называется
HISTORY_IGNORE="*secret.server.com*"
HISTIGNORE
может содержать несколько шаблонов, разделенных двоеточиями. HISTORY_IGNORE
определяет один шаблон, но шаблон может содержать альтернативы, разделенные вертикальными линиями. Обратите внимание, что каждый шаблон сравнивается с полной входной строкой, поэтому вам, возможно, придется включить *. Например, следующее исключит fortune
из истории, но сохранит fortune -l
:
HISTIGNORE="*secret.server.com*:ytalk*:fortune"
HISTORY_IGNORE="*secret.server.com*|ytalk*|fortune"
С установленным HISTIGNORE, ничего, соответствующего перечисленным шаблонам, не будет сохранено в .bash_history
/.zsh_history
, и даже клавиша со стрелкой вверх, которая обычно вызывает вашу предыдущую команду, не сработает, если она соответствует вашему шаблону.
В bash используйте переменную HISTCONTROL
.
Установите ее на HISTCONTROL=ignorespace
(или HISTCONTROL=ignoreboth
). С этого момента, когда вы начинаете строку с пробела, она не будет сохранена в истории. Это позволяет избегать включения команды, которую не следует раскрывать, в какой-либо конфигурационный файл.
Даже так, порой случается забыть добавить пробел и потом нужно вернуться. Чтобы удалить запись в истории, используйте history -d <index>
, где index
— номер, найденный с помощью команды history
(первая колонка).
Самый простой способ для единичного случая
$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$
где $
представляет собой строку запроса начальной оболочки, а $$
представляет собой строку запроса подоболочки. Это работает в bash и zsh; в ksh вам нужно использовать HISTFILE=/notwritable
вместо этого. Обратите внимание, что имеет значение значение HISTFILE
в момент записи в файл истории, а не когда команда выполняется. Bash, ksh и zsh записывают в файл истории при выходе (zsh может делать это чаще в зависимости от конфигурации).
Альтернативно, вы можете настроить bash или zsh для игнорирования строк, соответствующих определенным шаблонам (это уже покрывается другими ответами).
Еще одна возможность в zsh:
% fc -p
% secret-command
% fc -P
fc -p
отправляет текущий список истории на стек и начинает новый, который не связан с файлом сохранения. fc -P
извлекает из стека этот несохраненный список истории и полностью забывает о нем.
Пока процесс выполняется, команда и ее аргументы (а на некоторых системах и окружение тоже) будут показаны в таблице процессов (вывод ps
). Root может увидеть прошедшие команды в системной базе данных учета, и может делать больше логгирования без вашего контроля. И, вероятно, будет множество других свидетельств, которые могут примерно показать, какую команду вы выполнили (например, время модификации файлов). Так что вы не получаете конфиденциальности от решительных перехватчиков.
Чтобы использовать zsh
без сохранения в историю, вы можете настроить параметры HISTFILE
и HISTSIZE
в вашем файле конфигурации zsh
(~/.zshrc
), но я рекомендую вместо этого использовать новый файл конфигурации, чтобы просто загружать его всякий раз, когда вам нужна сессия zsh
без сохранения.
- Создайте новый конфигурационный файл
.zshrc
, возможно~/sessionless.zshrc
- Вставьте это:
# Это гарантирует, что история не будет сохранена в файл export HISTFILE=/dev/null # Это предотвращает сохранение любых команд в памяти во время сессии export HISTSIZE=0
- Загружайте его всякий раз, когда вам нужна сессия без сохранения
source ~/sessionless.zshrc
Ответ или решение
Конечно, существует множество способов предотвратить сохранение команды в истории вашей оболочки, включая zsh и bash. Этот вопрос крайне актуален для пользователей, которые беспокоятся о сохранении конфиденциальности или просто хотят держать терминал в чистоте от нежелательных команд. Рассмотрим несколько способов, которые могут помочь решить данную задачу.
Решения для ZSH
-
Использование
HIST_IGNORE_SPACE
:
Включите опциюHIST_IGNORE_SPACE
в вашем~/.zshrc
файле. Она позволяет не сохранять команды, начинающиеся с пробела:setopt HIST_IGNORE_SPACE
После включения этой опции, любые команды с пробелом в начале не будут сохраняться в истории.
-
Настройка
HISTORY_IGNORE
:
Если есть команды, содержащие определенные шаблоны, которые вы никогда не хотите сохранять, используйтеHISTORY_IGNORE
:HISTORY_IGNORE="*секретный_шаблон*|еще_один_шаблон"
Звездочка (*) позволяет игнорировать команды, содержащие определенный шаблон.
-
Временная история с
fc
:
Используйте командыfc -p
иfc -P
для создания временной истории, которая не сохраняется:% fc -p % ваша_секретная_команда % fc -P
Эта методика создает новую историю, которая не ассоциируется с файлом и удаляется по окончании сеанса.
Решения для BASH
-
Опция
HISTCONTROL
:
ЗадайтеHISTCONTROL
какignorespace
, и команды, начинающиеся с пробела, не будут сохранены:export HISTCONTROL=ignorespace
-
HISTIGNORE
для шаблонов:
Для игнорирования определенных команд используйтеHISTIGNORE
:HISTIGNORE="команда1:команда2"
Команды, соответствующие указанным шаблонам, не будут сохранены в истории.
Универсальный метод через сброс HISTFILE
Для временной работы в оболочке без записи истории можно просто сбросить HISTFILE
:
$ $SHELL
$$ unset HISTFILE
$$ ваша_секретная_команда
$$ exit
$
Это предотвратит сохранение любой истории в указанной оболочке.
Заключение
Применение данных методов обеспечит, что ваши команды останутся вне наблюдения истории. Однако важно помнить, что это не гарантирует полной безопасности или конфиденциальности: команды могут быть видны через системные логи или процесс-таблицы, поэтому всегда будьте внимательны при работе с особенно конфиденциальной информацией.