Виконати команду, не зберігаючи її в історії [закрито]


203

Я хочу виконати деякі команди, але не хочу зберігати їх в історії команд. Так що ніхто не зможе шукати його у .bash_historyфайлі.

Чи є спосіб, як виконати команди bash таким чином?


13
Це питання, мабуть, слід перенести на ServerFault, оскільки це не "програмування" настільки, скільки "адміністратор сервера" - але дякую за запитання / відповідь, саме те, що мені потрібно!
Ендрю Текен

Відповіді:


294

Почніть команду з пробілу, і вона не буде включена в історію.

Майте на увазі, що для цього потрібна установка змінної середовища $HISTCONTROL.

  • Перевірте, ignorespaceчи повертається наступна команда або ignoreboth

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

    export HISTCONTROL=ignorespace

Після пошуку профілю знову місця, префіксні команди не записуються $HISTFILE


20
Це не працює, якщо ігнорний простір не включений у $ HISTCONTROL - хоча це, мабуть, за замовчуванням у більшості систем.
pgl

2
Правильно. Для більш детальної інформації ОП має ознайомитись з системою HISTCONTROL та HISTIGNORE на сторінці bash man.
u-punkt

2
thegeekstuff.com/2008/08/… - більше підказок з історії баш можна переглянути тут, включаючи цей спосіб приховування команд від історії
user379997

52

У будь-якому даному сеансі Bash встановіть файл історії в / dev / null, ввівши:

export HISTFILE=/dev/null

Зауважте, що, як зазначено в коментарях, це команда не записує жодних команд на цьому сеансі в історію!

Просто не возиться з наполегливою роботою вашого адміністратора;)

Рішення Doodad є більш елегантним. Просто зніміть змінну: unset HISTFILE(спасибі!)


5
Це запобіжить реєстрацію всіх команд. Це не те, чого хоче запитувач.
Нуфал Ібрагім

12
Це спричинило для мене проблеми, пов’язані з встановленням /dev/nullдозволів 0600 при виході. Натомість я використав unset HISTFILE.
Doodad


21

Розширення відповіді @John Doe & @ user3270492 Але, здається, це працює для мене.

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

Ви не повинні бачити запис команди у своїй історії.

Ось пояснення ..

"Історія -d" видаляє згаданий запис з історії.

HISTCMD зберігає командний номер того, який буде виконуватися далі. Отже, (HISTCMD-1) посилається на останню виконану команду.

Видаліть певний рядок із файлу історії Bash


На жаль, це не працювало для мене.
Magick

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

Тоді ви відредагували свою історію та факт, що ви її редагували!


Спробував це на: GNU bash, версія 3.2.57 (1) -release (x86_64-apple-darwin15), і це не працює. Команди, які я використав після зняття ІСТОРІЇ, зберігалися в ~ / .bash_history
Krystian

@Krystian Моя помилка - я написав "unset HISTORY", коли слід "unset HISTFILE" - виправлено. Чи працює це зараз? Він працює на GNU bash, версія 4.3.30 (1) -release (x86_64-pc-linux-gnu).
drkvogel

ну я не впевнений. Простий тест: unset HISTFILE; echo TEST; historyдасть вам команду echo TESTяк попередню до останньої. Хоча після припинення сеансу та підключення знову історія не має цього запису. Тому я б сказав, що це працює :)
Кристян

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."'

Приємно, але це питання спеціально позначено баш
трійка

2

Існує кілька способів цього досягти. Це встановлює розмір файлу історії 0:

export HISTFILESIZE=0

Це встановлює файл історії /dev/null, фактично вимикаючи його:

export HISTFILE=/dev/null

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


2
Це запобіжить реєстрацію всіх команд. Це не те, чого хоче запитувач.
Нуфал Ібрагім

Що ж, я начебто припускав, що запитуючий скине значення, зробивши все, що він хотів, що не повинен реєструватися.
pgl

1

Це зручно, якщо ви хочете стерти всю історію, включаючи той факт, що ви видалили всю історію!

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

0

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

Щоб побачити більше, запустіть:
$ man set


2
Це вимикає історію для всіх майбутніх команд, а не для окремої команди. Більшість людей, які приїжджають сюди, повинні дивитись на прийняту відповідь.
трійчатка

Це дійсно, або добре, але неповно. Поки ми set -x historyзгодом додаємо команду зворотного ходу , вона працює.
Абділла

0

Ця команда може стати в нагоді. Це не буде записувати виконану команду

history -d $((HISTCMD-1)) && <Your Command Here>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.