История командной строки в Linux
Oct. 24th, 2012 05:25 pmИстория командной строки в 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
Например в листинге истории мы видим под номер 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 .profile5. Поиск команды начинающейся с определенных символов
Поиск можно упростить, набрав знак ! и первые буквы запускаемой команды (конечно, если вы эту команду уже использовали ранее и она есть в истории)
Например:
# !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: 297966. Изменение длины истории
Чтобы изменить количество строк, хранящихся в истории, необходимо отредактировать файл ~/.bashrc (это для Ubuntu, в других дистрибутивах встречается ~/.bash_profile)
Где выставляем в параметрах HISTSIZE и HISTFILESIZE максимальное число строк хранимых в истории.
У меня например:
HISTSIZE=1000
HISTFILESIZE=2000
По умолчанию файл истории располагается в ~/.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
И Вы чисты перед законом =)
Все тоже очень просто, выставляем значение размера истории в ноль.
# export HISTSIZE=012. Игнорирование определенных команд
Например вы хотите, чтобы простейшие команды типа 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 в историю не попали, чего мы и добивались.
На этом закончим краткий обзор, надеюсь кому-нибудь он будет полезен.