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


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.