Debian.pro

Блог для пользователей и администраторов Debian


Хинт: как ввести (одну) команду в консоли так, чтобы она не попала в history

Иногда возникает необходимость ввести команду в консоли так, чтобы команда не попала в history.
Сразу оговоримся, что данный хинт не спасет вас от логгирования всех команд на уровне демона ssh или от включенного логирования в /etc/profile
Проверял я это в sh, csh и bash. После употребления данной фичи, команду нельзя повторить, нажав стрелку вверх, и она не появляется в выводе history.

Идея очень простая — перед командой нужно поставить пробел. Либо это баг парсера, либо умышленная ф-ция. Но работает:

inky@laptop:~$ uname
Linux
inky@laptop:~$ uptime
21:29:07 up 3:42, 8 users, load average: 1.08, 1.05, 1.05
#перед этой командой - пробел (парсер водпресса их кушает):
inky@laptop:~$ cat /proc/cpuinfo | grep vendor
vendor_id : GenuineIntel
vendor_id : GenuineIntel
vendor_id : GenuineIntel
vendor_id : GenuineIntel
inky@laptop:~$ history | tail -n 4
155 exit
156 uname
157 uptime
158 history | tail -n 4

Перед командой cat /proc/cpuinfo стоит пробел в данном случае.

Секрет данного хинта раскрыт. В ~/.bashrc должна быть строчка:
HISTCONTROL=ignoredups:ignorespace
В убунте и дебиане по дефолту она есть. В дебиане в рутовом bashrc её нет. Алсо можно так:

export HISTCONTROL=$HISTCONTROL${HISTCONTROL+,}ignoredups
export HISTCONTROL=ignoreboth

25.04.2011 byinkvizitor68sl|хинты
Метки:

Комментарии (12):

  1. Денис :

    [Иногда возникает необходимость ввести команду в консоли так, чтобы команда не попала в history.]

    Вот честно, что это за необходимости такие? Я как-то даже таких ситуаций придумать не могу, где мне пришлось бы исполнять команду так, чтобы она не сохранялась в хистори. Пару примеров, можно? ;-)

  2. Ну собственно 2 глобальных случая — когда надо, чтобы никто потом эту команду не увидел (и вы уверены, что логгирования нет) и когда не хочется спамить в history какими-либо командами. Если подробнее то:
    1) учим саппортера. Учебный сервер. Нужно создать ему проблему на сервере, потом заставить починить. Вводим левые команды, потом с пробелом вводим те, которые всё поломают.
    2) иногда приходится несколько раз подряд вводить какую-либо команду (ну вот привычка у меня при тюнинге батарейки постоянно тыркать acpi, чтобы посмотреть заряд актуальный). Нафига нам 100500 одинаковых команд. Переконфигурять history лениво
    3) делаем что-то такое, что не нужно показывать работодателю (профессиональные секреты или что-то постыдное) на его сервере.
    4) просто команда-спам. Ну на кой черт в хистори держать всякие rm/mv/cp ? Или саму команду history ) ?

  3. oxcd8o :

    раз:
    gw ~ # uptime
    23:03:54 up 23 days, 3:09, 1 user, load average: 0.69, 0.15, 0.05

    два, ставим пробел перед командой:
    gw ~ # uname -a
    Linux gw.oxcd8o.org 2.6.26-2-686 #1 SMP Thu Jan 27 00:28:05 UTC 2011 i686 GNU/Linux

    три:
    gw ~ # history | tail -n 3
    500 uptime
    501 uname -a
    502 history | tail

    если вордпресс опять схавал пробелы — то уточню, что в хистори umame -a попал с пробелом. дебиан 5.0
    ЧЯДНТ?

  4. А шелл какой?

  5. oxcd8o :

    bash.
    кстати в 6 дебиане и генте тоже не работает фенечка

  6. Попробуй нового пользователя создать и от его имени попробовать.

  7. oxcd8o :

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

  8. Скинь на paste.pro ~/.bashrc из генты и дебиана от двух пользователей. И ссылки сюда. Гляну, что именно влияет.

  9. Из башевого мана.
    HISTCONTROL
    A colon-separated list of values controlling how commands are saved on the history list. If the list of values includes ignorespace, lines which begin with a space character are not saved in the history list. A value of ignoredups causes lines matching the previous history entry to not be saved. A value of ignoreboth is shorthand for ignorespace and ignoredups. A value of erasedups causes all previous lines matching the current line to be removed from the history list before that line is saved. Any value not in the above list is ignored. If HISTCONTROL is unset, or does not include a valid value, all lines read by the shell parser are saved on the history list, subject to the value of HISTIGNORE. The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of HISTCONTROL.
    HISTIGNORE
    A colon-separated list of patterns used to decide which command lines should be saved on the history list. Each pattern is anchored at the beginning of the line and must match the complete line (no implicit `*’ is appended). Each pattern is tested against the line after the checks specified by HISTCONTROL are applied. In addition to the normal shell pattern matching characters, `&’ matches the previous history line. `&’ may be escaped using a backslash; the backslash is removed before attempting a match. The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of HISTIGNORE.

  10. oxcd8o :

    все дело и правда в export HISTCONTROL=ignoreboth.
    у рута в дебиане и у всех юзеров в генте .bashrc минималистичен, а вот обычным дебиан-юзерам достается куча всяких настроек.

  11. konstantine :

    Эта фича является багой bash`a и ему подобных, на той же фре в csh этого не наблюдается.
    Но если честно, когда я хотел не палиться при хакинге чьих то серверов/декстопов, то просто скриптом грепал и чистил все логированные обо мне записи из всех журналов и историй.

    п.с. на будущее: Если вы вдруг нашли у кого то дыру или трещину в безопасности, то большая просьба не умалчивать об этом и тем более не использовать в злых целях, а поступать благородно и предупреждать хозяина о проблеме. Респект вам всегда вернётся, поверьте…..

  12. Это не баг. Мы тут чуть выше нашли как это включается/выключается.

Написать комментарий