oio11: (Default)
[personal profile] oio11

История командной строки в 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. Набрав !-1
4. Или нажав Ctrl+P

4. Запуск определенной команды из истории

Например в листинге истории мы видим под номер 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=1000
HISTFILESIZE=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 в историю не попали, чего мы и добивались.
На этом закончим краткий обзор, надеюсь кому-нибудь он будет полезен.
http://greendail.ru/node/477

October 2025

S M T W T F S
   1234
567891011
12131415161718
19202122 232425
262728293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 5th, 2026 10:40 pm
Powered by Dreamwidth Studios