Терминал «режим инкогнито»?


230

Я часто использую Терминал, и иногда я выполняю команды, которые я не хочу видеть другими, но больше команд, которые, если бы я случайно попал на стрелку и случайно выполнил, вызвали бы много проблем.

Поэтому мне интересно, есть ли или я могу создать какой-то терминал в «режиме инкогнито», который позволил бы мне при выполнении определенной команды прекратить запись моей истории, а затем начать запись только после того, как я выполню снова начать запись истории и выйти из режима инкогнито, или я просто перезапущу Терминал?

Потому что позже я пойду и удаляю вещи из своего .bash_history, когда было бы намного легче, если бы я мог остановить их запись там, во-первых, или, по крайней мере, заставить их попытаться записать это где-то, где этого просто не было бы разрешено, и в конечном итоге не будет записывать его.


6
Ну, возможно, ты параноик, что твою историю будут читать другие?
Sparhawk

6
@ Sparhawk: Ну, отчасти это так, и вечеринка, которую я не хочу случайно выполнить, возможно, смертельно опасную команду обслуживания, когда буду стрелять вверх в будущем! : D

19
Просто добавлю, вам не нужно оправдываться: «это не то, чего я не хочу, чтобы другие видели» . Это было бы совершенно веской причиной для меня тоже. (Особенно в это время и в то время, когда все пытаются заставить вас выглядеть виноватыми за то, что у вас есть «что скрывать»)
ereOn

2
Если вы открываете две вкладки, делаете вещи в первой, делаете вещи во второй, а затем закрываете другую ДО ПЕРЕД первой, кажется, что записана только история первой .bash_history. (Ubuntu 15.04 испортил Терминал, к
счастью,

1
Посмотрите этот вопрос на сервере
Люк М

Ответы:


265

Запустите команду, не помещая ее в историю:

Просто поставьте пробел перед командой. Bash будет игнорировать команды с пробелом:

Пример: Spaceecho "Some secret text"

Примечание. Это работает, только если для HISTCONTROLпеременной задано значение ignorespaceили ignoreboth.


Отключить историю временно:

  • Запустить Spaceset +o historyили Spaceshopt -uo historyотключить историю.
  • Запустите set -o historyили, shopt -so historyчтобы включить его снова.

Отключить историю для текущего сеанса (не запомнит никаких команд из сеанса):

unset HISTFILE

Примечание. Команды будут видны до Upтех пор, пока вы не закроете терминал.


Удалить команду из истории:

Бегать Spacehistory | grep "part of your secret command"

Он покажет список ранее выполненных команд в следующем формате:

casa@portátil:~$  history | grep pkill
  302  pkill $$
  467  pkill gone-cal
  468  pkill actionaz
  500  pkill chrome
  550  pkill super

Выберите номер записи слева от команды. Вы можете скопировать его с Ctrl+ Shift+C

Запустите, Spacehistory -d <number>где <number>номер записи, чтобы удалить запись.
Вы можете вставить это число с помощью Ctrl+ Shift+V


Другие интересные ответы:


7
Если вы используете history -dудаление строки, это приведет к удалению содержимого строки, но вы никогда не сможете удалить тот факт, что вы запустились history -d(если только вы не использовали его set +o historyперед запуском history -d)
AJFaraday

1
Это просто напомнило мне логику супер-запрета, вот и все;)
AJFaraday

4
(OT) Запреты являются юридическим документом, который удерживает людей от публикации чего-либо. Супер-судебный запрет также удерживает их от публикации того факта, что им было отказано в возможности публикации. Некоторые логические аргументы спрашивают, могут ли они публиковать, что им было отказано в возможности публиковать некоторую информацию. Тогда это становится циклическим аргументом.
AJFaraday

1
@ Helio Я думаю, пользователям лучше знать «правильный» способ копирования, особенно если они случайно выберут какой-нибудь текст. Я не уверен, как сделать пространство, может быть, уточнить, что пространство есть? [Космос] выглядит немного неуклюжим для меня ...
Тим

2
unset HISTFILEПодход работает также задним числом для всех команд , которые не были записаны в .bash_historyеще.
Касперд

40

Вы можете просто удалить историю одного конкретного сеанса терминала , добавив команду history -cwпосле работы.

Не закрывайте терминал перед подачей этой команды.


Это не удалит всю историю?
Гелио

6
Это только удалит историю этого конкретного сеанса терминала.
Моитил Бисвас

28

shopt -uo history должен сделать это лучше всего.

Обнуление HISTFILEпеременных (и других) не остановит запись вашей Upистории, просто не вытолкнет ее на диск. Это может или не может быть положительным для вас, но, учитывая, что вы упомянули об этом, я думаю, вы хотите что-то лучше. Изменение shoptнастройки истории останавливает запуск всего механизма истории.

Вы можете снова включить регистрацию с помощью shopt -so history( -sи, соответственно, -uони установлены и не установлены).

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


17

Другой способ убить текущую оболочку без входа в файл истории - это сделать:

kill -9 $$

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


7
ака «Стреляй себе в голову» :). Преимущество в том, что вам не нужно ничего делать, прежде чем писать команды.
Гвидо

3
Я использую zsh с добавочной записью истории, поэтому сомневаюсь, что это сработает в моем случае
Уэйн Вернер

13

Чтобы временно отключить историю команд для текущего сеанса, вы можете временно удалить переменную среды HISTFILE.

unset HISTFILE

пока сеанс активен, вы можете обращаться к истории как обычно, но она не будет сохранена на диск.

Чтобы отменить в том же сеансе (все изменения будут записаны)

HISTFILE=$HOME/.bash_history

1
И есть ли простой способ в текущем сеансе изменить это и заставить его продолжать?

@ParanoidPanda Я добавил команду для возврата в текущем сеансе.
Бруни

1
@ParanoidPanda: Зачем вам нужна команда для HISTFILEповторной установки в текущем сеансе? Если вы отмените изменение (даже после выполнения секретных команд), они будут сохранены в истории при выходе.
Гелио

@Helio: О нет, я имел в виду команду, которая затем снова начнет запись, но не сохраняет команды, которые я не хотел сохранять.

1
@ParanoidPanda, Хелио, кажется, прав в этом, так как история сохраняется при выходе. Я не учел это.
Бруни

10

Вы можете изменить строки истории в текущем сеансе оболочки. Если вы вернетесь назад к истории (например, с помощью Upили Ctrl+ P) и измените строку, не выполняя ее , будет сохранена только измененная версия строки. Вы можете изменить его так, как вам нравится; Хороший выбор будет включать использование Ctrl+, Uчтобы полностью очистить строку или использование, Esc#чтобы поместить #символ комментария в начале.

Чтобы оставить строку без выполнения, не забудьте нажать Return( Enter). Что я делаю, так это возвращаюсь к новейшей линии в истории через Esc>.

(Вместо того, чтобы Escследовать >, в большинстве терминалов вы можете удерживать Altи нажимать >; то же самое относится к Esc#предложению выше.)

Примечание. Таким способом нельзя навсегда изменить записи из предыдущих сеансов. Эти изменения не будут применены к HISTFILEконцу сеанса.


6

Вы также можете сделать .bash_history только для чтения. Я бы сначала очистил файл, а затем сделал:

 chattr +i .bash_history

5

Вы можете выполнить конфиденциальные команды в сеансе экрана, а затем уничтожить сеанс, когда закончите.

С другой стороны, вы можете сохранить этот сеанс экрана живым, но отключенным, и получать к нему доступ только тогда, когда вы действительно хотите иметь возможность стрелку вверх к другим опасным командам.


1

Лично я использую mksh, и эта оболочка по умолчанию не имеет файла истории. Это означает, что вы можете запустить альтернативную оболочку, такую ​​как mkshили dash(которая, кстати, поставляется по умолчанию), чтобы запустить команду, которую пользователи не хотят видеть, и выйти из нее после завершения. bashистория будет только записывать, что вы запустили альтернативную оболочку и все.


1

Вы можете также использовать терминальный мультиплексор , такие как tmux, screen. Так что под tmuxили screenистория не будет сохранена.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.