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

203

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

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

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

Ответы:

295

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

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

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

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

    export HISTCONTROL=ignorespace

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

U-Punkt
источник
20
Это не сработает, если в $ HISTCONTROL не включено пространство игнорирования, хотя, вероятно, это значение по умолчанию в большинстве систем.
pgl
2
Верный. Для более подробной информации, OP должен взглянуть на HISTCONTROL и HISTIGNORE на странице руководства bash.
u-punkt
2
thegeekstuff.com/2008/08/… - здесь можно найти больше советов по истории bash, включая этот метод скрытия команд из истории
user379997
52

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

export HISTFILE=/dev/null

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

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

Решение Doodad является более элегантным. Просто сбросьте переменную: unset HISTFILE(спасибо!)

Микель
источник
5
Это предотвратит регистрацию всех команд. Это не то, что хочет спрашивающий.
Нуфал Ибрагим
12
Это вызвало проблемы для меня, связанные с /dev/nullразрешениями, установленными на 0600 при выходе. Вместо этого я использовал unset HISTFILE.
Doodad
36
echo "discreet";history -d $(history 1)
Джон Доу
источник
4
Ох, командный контроль? Ницца.
Кайл Стрэнд
21

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

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

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

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

'History -d' удаляет упомянутую запись из истории.

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

Удалить определенную строку из файла истории Bash

Rangaraj KS
источник
К сожалению, это не сработало для меня.
Магия
10

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

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

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

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

batch << EOB
   your commands
EOB

История будет содержать shили batchне очень значимым

Василий Старынкевич
источник
8

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

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

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

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

Кристиан
источник
На это уже отвечали много раз. Что бы вы сказали, что ваш ответ добавляет к этой теме (кроме бесполезного шума)?
gniourf_gniourf
Он не был составлен в одном ответе , чтобы не отображать саму команду в истории и не отображать ничего, что было введено впоследствии.
Кристиан
1
Но теперь эта тема - настоящий беспорядок! в этом случае, особенно для такого старого вопроса, я считаю, что лучше отредактировать уже существующие хорошие ответы и / или оставить комментарий…
gniourf_gniourf
5

Как уже упоминалось в комментариях 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

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

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

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

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

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

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

Если вы используете 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."'
Rotareti
источник
Хорошо
2

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

export HISTFILESIZE=0

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

export HISTFILE=/dev/null

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

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

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

rm .bash_history;export HISTFILE=/dev/null;exit
CND
источник
0

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

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

Игорь Сантос
источник
2
Это отключает историю для всех будущих команд, а не для отдельной команды. Большинство людей, которые приходят сюда, должны смотреть на принятый ответ.
tripleee
Это верно или хорошо, но не полностью. Пока мы добавляем обратную команду set -x history, она работает.
Абдилла
0

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

history -d $((HISTCMD-1)) && <Your Command Here>
РАВИ ТЕЯ
источник