Выполнить команду, не сохраняя ее в истории

147

Я хочу выполнить некоторые команды, но не хочу их хранить в истории команд. Чтобы никто не смог выполнить поиск в файле .bash_history.

Есть ли способ выполнить команды bash таким образом?

  • 10
    Этот вопрос, вероятно, следует перенести в ServerFault, поскольку это не столько «программирование», сколько «администрирование сервера» - но спасибо за вопрос / ответ, именно то, что мне было нужно!
Теги:

13 ответов

217
Лучший ответ

Начните свою команду с пробела, и она не будет включена в историю.

Помните, что для этого требуется установить переменную среды $HISTCONTROL.

  • Убедитесь, что следующая команда возвращает ignorespace или ignoreboth

    #> echo $HISTCONTROL
    
  • Чтобы добавить переменную окружения, если она отсутствует, следующая строка может быть добавлен в профиль bash. Например. %HOME/.bashrc

    export HISTCONTROL=ignorespace
    

После поиска профиля снова пробелы префиксные команды не будут записываться в $HISTFILE

  • 15
    Это не сработает, если в $ HISTCONTROL не включено пространство игнорирования - хотя, вероятно, это значение по умолчанию в большинстве систем.
  • 2
    Правильный. Для более подробной информации, OP должен взглянуть на HISTCONTROL и HISTIGNORE на странице руководства bash.
Показать ещё 1 комментарий
45

В любом заданном сеансе bash установите файл истории в /dev/null, набрав:

export HISTFILE =/dev/null

Обратите внимание, что, как указано в комментариях, это не будет записывать какие-либо команды в этом сеансе в историю!

Просто не возитесь с тяжелой работой вашего sysadmin, пожалуйста;)

[UPDATE] Решение @Doodad более элегантно, просто отключите переменную: unset HISTFILE (спасибо!)

  • 4
    Это предотвратит запись всех команд. Это не то, что хочет спрашивающий.
  • 12
    Это вызвало у меня проблемы, связанные с тем, что при выходе из системы для /dev/null были заданы права доступа 0600. Вместо этого я использовал unset HISTFILE .
26
echo "discreet";history -d $(history 1)
  • 3
    Ох, командный контроль? Ницца.
14

Расширение @John Doe и @user3270492 ответ. Но, похоже, это работает для меня.

<your_secret_command>; history -d $((HISTCMD-1))

Вы не должны видеть запись команды в своей истории.

Вот объяснение..

"История -d" удаляет указанную запись из истории.

В HISTCMD хранится номер_команды, который будет выполнен следующим. Итак, (HISTCMD-1) относится к последней выполненной команде.

https://superuser.com/a/529193

10

Вы можете рассмотреть возможность использования оболочки без истории, как, возможно,

/bin/sh << END
   your commands without history
END

(возможно, /bin/dash или /bin/sash могут быть более подходящими, чем /bin/sh)

или даже лучше использовать пакетную утилиту, например

batch << EOB
   your commands
EOB

В этом случае история будет содержать sh или batch что не очень важно

6

Вы можете начать сеанс с

export HISTFILE=/dev/null ;history -d $(history 1)

затем приступайте к подлым делам. Установка для файла истории /dev/null будет записана в файл истории, однако эта запись будет легко удалена, и никакие следы (по крайней мере, в файле истории) не будут показаны.

Кроме того, это непостоянно.

  • 0
    На это уже отвечали много раз. Что бы вы сказали, что ваш ответ добавляет к этой теме (кроме бесполезного шума)?
  • 0
    Он не был составлен в одном ответе , чтобы не отображать саму команду в истории и не отображать ничего, что вводилось впоследствии.
Показать ещё 1 комментарий
4

Вы также можете использовать следующую команду:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

Я думаю, что это очень портативная команда

  • 0
    Я создал псевдоним из этого: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')" и теперь вы можете сделать это примерно так: mysql -uroot -pSecretPassword ; forget
  • 1
    Извините, но я понимаю, что вам нужно создать функцию вместо псевдонима, потому что кавычки меняют значение $s и другие вещи в sed. function forget() { // put code here // }
3

Как уже упоминалось @Doodad в комментариях, unset HISTFILE делает это красиво, но в случае, если вы также хотите удалить некоторую историю, сделайте echo $HISTFILE, чтобы получить местоположение файла истории (обычно ~/.bash_history), затем unset HISTFILE, затем отредактируйте ~/.bash_history (или что-то еще HISTFILE было - конечно, теперь unset, чтобы вы не могли его прочитать).

$ echo $HISTFILE       # e.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # or your preferred editor

Затем вы отредактировали свою историю и тот факт, что вы ее отредактировали!

  • 0
    Попробовал это на: GNU bash, версия 3.2.57 (1) -релиз (x86_64-apple-darwin15), и он не работает. Команды, которые я использовал после сброса ИСТОРИИ, были сохранены в ~ / .bash_history
  • 0
    @Krystian Моя ошибка - я написал «unset HISTORY», когда она должна быть «unset HISTFILE» - исправлена. Это работает сейчас? Работает на GNU bash, версия 4.3.30 (1) -релиз (x86_64-pc-linux-gnu).
Показать ещё 2 комментария
2

Есть несколько способов добиться этого. Это устанавливает размер файла истории в 0:

export HISTFILESIZE=0

Это устанавливает файл истории в /dev/null, эффективно отключая его:

export HISTFILE=/dev/null

Для отдельных команд вы можете префикс команды с пробелом, и он не будет сохранен в файле истории. Обратите внимание, что для этого требуется значение ignorespace, включенное в переменную среды $HISTCONTROL (man bash и поиск ignorespace).

  • 1
    Это предотвратит запись всех команд. Это не то, что хочет спрашивающий.
  • 0
    Ну, я вроде бы предположил, что спрашивающий сбрасывает значения после того, как он делает все, что ему нужно, что не должно регистрироваться.
1

Если вы используете zsh, вы можете запустить:

setopt histignorespace

После того, как это установлено, каждая команда, начинающаяся с пробела, будет исключена из истории.

Вы можете использовать псевдонимы в .zshrc чтобы включить /выключить это:

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'
  • 0
    Хорошо, но этот вопрос специально помечен bash
1

Это удобно, если вы хотите удалить всю историю, включая тот факт, что вы удалили всю историю!

rm .bash_history;export HISTFILE=/dev/null;exit
0

Вам просто нужно запустить:
$ set +o history

Чтобы увидеть больше, запустите:
$ man set

  • 0
    Это отключает историю для всех будущих команд, а не для отдельной команды. Большинство людей, которые приходят сюда, должны смотреть на принятый ответ.
0

Эта команда может пригодиться. Это не будет записывать команду, которая выполняется

история -d $ ((HISTCMD-1)) &&

Ещё вопросы

Сообщество Overcoder
Наверх
Меню