История командной строки в Linux

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

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

В данной мини-статье хотел бы описать несколько примеров работы с историей командной строки, надеюсь эта информация поможет многим "мученикам".

Рассматривать мы будем основном команду history, которая есть практически в любом шелле, но приведенные примеры больше относятся к башу.

Итак, простой вывод команды history покажет список всех команд выполненных в консоли для данного пользователя, у меня например вывод занял 500 строк, приведу небольшой кусок: 

#history  
  485  dig ya.ru
  486  dig @ns1.yandex.ru ya.ru
  487  dig @ns1.yandex.ru ya.ru
  488  mc
  489  su
  490  dig @ns1.yandex.ru ya.ru
  491  history | more
  492  history | more
  493  top
  494  history | more
  495  history | more
  496  history
  497  exit

Если history Вам ничего не вывела, необходимо проверить включена ли опция:

#set -o

Ищем параметр history, напротив него должно стоять on.Если он выключен (off), необходимо выполнить -

#set -o history

Рассмотрим некоторые примеры:

1. Вывод даты и времени выполнения команд

Несколько отформатируем наш вывод истории, для этого используем опцию - HISTTIMEFORMAT 

# export HISTTIMEFORMAT='%F %T '
# history | more
..........
491  2012-04-05 13:02:05 history | more
492  2012-04-05 13:05:13 history | more
493  2012-04-05 13:05:48 top
494  2012-04-05 13:05:57 history | more
495  2012-04-05 13:06:51 history | more
496  2012-04-05 13:48:40 history
497  2012-04-05 13:50:53 exit
498  2012-04-05 13:50:56 exit
499  2012-04-05 14:00:38 set -o
500  2012-04-05 14:04:26 484  dig ya.ru
501  2012-04-05 14:24:55 export HISTTIMEFORMAT='%F %T '
502  2012-04-05 14:25:05 history | more

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

Например Вам нужно вести длинную команду, целиком вы ее не помните, но помните некоторые слова из нее, в этом нам поможет комбинация клавиш Ctrl+R, после чего мы вводим искомое слово. Например я буду искать ya.ru. 

(reverse-i-search)`ya.ru': 484  dig ya.ru

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

3. Повторение предыдущей команды

Повторить предыдущую команду можно разными способами:1. Использовать кнопки стрелок (вверх, вниз)2. Набрав !!3. Набрав !-14. Или нажав Ctrl+P4. Запуск определенной команды из истории

Например в листинге истории мы видим под номер 504 команду ls и хотим повторить   

 501  2012-04-05 14:24:55 export HISTTIMEFORMAT='%F %T '
  502  2012-04-05 14:25:05 history | more
  503* 2012-04-05 14:32:13
  504  2012-04-05 14:39:35 ls
  505  2012-04-05 14:39:37 ls
  506  2012-04-05 14:40:09 ls
  507  2012-04-05 14:42:01 history | more

Таким образом запускаем просто !504 

# !504
ls
.bash_history   .history        .login          .mysql_history  .spamassassin
.cshrc          .k5login        .mc             .profile


5. Поиск команды начинающейся с определенных символов

Поиск можно упростить, набрав знак ! и первые буквы запускаемой команды (конечно, если вы эту команду уже использовали ранее и она есть в истории)Например: 

# !di
dig @ns1.yandex.ru ya.ru

; <<>> DiG 9.6.-ESV-R3 <<>> @ns1.yandex.ru ya.ru
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29796

6. Изменение длины истории

Чтобы изменить количество строк, хранящихся в истории, необходимо отредактировать файл  ~/.bashrc (это для Ubuntu, в других дистрибутивах встречается  ~/.bash_profile)

Где выставляем в параметрах HISTSIZE и HISTFILESIZE максимальное число строк хранимых в истории.У меня например:HISTSIZE=1000HISTFILESIZE=2000

7. Изменение имени файла истории

По умолчанию файл истории располагается в  ~/.bash_history. Но например, вы хотите видеть одну историю запущенных команд при работе в разных терминальных сессиях, которые используют различные имена файлов истории. Например будем складывать историю в commandline_warrior 

# nano ~/.bash_profile
HISTFILE=/root/.commandline_warrior

После чего необходимо перезапустить шелл.8. Игнорирование повторов при выводе истории

Для того чтобы не выводить дубликаты команд в истории необходимо параметру HISTCONTROL задать значение ignoredups.

Для примера:

# export HISTCONTROL=ignoredups
# pwd
# pwd
# pwd
# history | tail -3
56  export HISTCONTROL=ignoredups
57  pwd
58  history | tail -4

Мы видим, что набранная нами команда pwd вывелась всего один раз.9. Удаление дубликатов со всего файла историиДля этого указываем значение erasedups в параметре HISTCONTROL.10. Очистка историиТут все просто -

# history -c

И Вы чисты перед законом =)11. Отключение историиВсе тоже очень просто, выставляем значение размера истории в ноль. 

# export HISTSIZE=0

12. Игнорирование определенных командНапример вы хотите, чтобы простейшие команды типа ls или pwd не замусоривали историю.Для этого рассмотрим пример: 

# export HISTIGNORE="pwd:ls:ls -ltr:"
# pwd
# ls
# ls -ltr
# service httpd stop

На выходе получаем 

# history | tail -3
79  export HISTIGNORE="pwd:ls:ls -ltr:"
80  service httpd stop
81  history

То бишь команды pwd и ls в историю не попали, чего мы и добивались.

На этом закончим краткий обзор, надеюсь кому-нибудь он будет полезен. 

Интересное на сайте: 
0
Голосов пока нет

Комментарии

вот почему я узнал про эту команду относительно недавно, когда начал готовиться к экзаменам по Red Hat? сколько нервов было бы сохранено в целости :-)

Как добавить в список исключений:
export HISTIGNORE=""
Команду:
sudo shutdown -h 12:00
может можно как-нибудь заэкранировать ":"