История командной строки в 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 в историю не попали, чего мы и добивались.
На этом закончим краткий обзор, надеюсь кому-нибудь он будет полезен.
Комментарии
эх...
вот почему я узнал про эту команду относительно недавно, когда начал готовиться к экзаменам по Red Hat? сколько нервов было бы сохранено в целости :-)
Как добавить в список
Как добавить в список исключений:
export HISTIGNORE=""
Команду:
sudo shutdown -h 12:00
может можно как-нибудь заэкранировать ":"