Поиск по сайту:

Возможности «History Command» Linux в Bash Shell


Мы часто используем команду history в наших повседневных рутинных задачах, чтобы проверить историю команд или получить информацию о команде, выполненной пользователем. В этом посте мы увидим, как эффективно использовать команду истории для извлечения команды, которая была выполнена пользователями в оболочке Bash. Это может быть полезно для целей аудита или для выяснения, какая команда выполняется в какую дату и время.

По умолчанию дата и метка времени не отображаются при выполнении команды история. Однако оболочка bash предоставляет инструменты CLI для редактирования истории команд пользователя. Давайте посмотрим на несколько полезных советов и приемов, а также на возможности команды history.

1. Список последних/всех выполненных команд в Linux

Выполнение простой команды history из терминала покажет вам полный список последних выполненных команд с номерами строк.

[narad@tecmint ~]$ history

    1  PS1='\e[1;35m[\u@\h \w]$ \e[m '
    2  PS1="\e[0;32m[\u@\h \W]$ \e[m "
    3  PS1="\u@\h:\w [\j]$ "
    4  ping google.com
    5  echo $PS1
    6   tail -f /var/log/messages
    7  tail -f /var/log/messages
    8  exit
    9  clear
   10  history
   11  clear
   12  history

2. Перечислите все команды с датой и отметкой времени.

Как найти дату и метку времени по команде? Команда export с переменной отобразит историю команды с соответствующей отметкой времени, когда команда была выполнена.

[narad@tecmint ~]$ export HISTTIMEFORMAT='%F %T  '

      1  2013-06-09 10:40:12   cat /etc/issue
      2  2013-06-09 10:40:12   clear
      3  2013-06-09 10:40:12   find /etc -name *.conf
      4  2013-06-09 10:40:12   clear
      5  2013-06-09 10:40:12   history
      6  2013-06-09 10:40:12   PS1='\e[1;35m[\u@\h \w]$ \e[m '
      7  2013-06-09 10:40:12   PS1="\e[0;32m[\u@\h \W]$ \e[m "
      8  2013-06-09 10:40:12   PS1="\u@\h:\w [\j]$ "
      9  2013-06-09 10:40:12   ping google.com
     10  2013-06-09 10:40:12   echo $PS1
Значение переменных HISTTIMEFORMAT
%F Equivalent to %Y - %m - %d
%T Replaced by the time ( %H : %M : %S )

3. Фильтровать команды в истории

Как мы видим, одна и та же команда повторяется несколько раз в приведенном выше выводе. Как фильтровать простые или неразрушающие команды в истории? Используйте следующую команду «export», указав команду в HISTIGNORE=’ls -l:pwd:date:’, она не будет сохранена системой и не будет отображаться в команде истории.

[narad@tecmint ~]$ export HISTIGNORE='ls -l:pwd:date:'

4. Игнорируйте повторяющиеся команды в истории.

Приведенная ниже команда поможет нам игнорировать дублирующиеся команды, введенные пользователем. В истории будет отображаться только одна запись, если пользователь выполняет одну и ту же команду несколько раз в командной строке Bash.

[narad@tecmint ~]$ export HISTCONTROL=ignoredups

5. Команда отмены экспорта

Отмените команду экспорта на лету. Выполните команду unset Export с переменной одну за другой, все команды, которые были экспортированы командой export.

[narad@tecmint ~]$ unset export HISTCONTROL

6. Сохранить команду экспорта навсегда

Сделайте следующую запись в .bash_profile, чтобы навсегда сохранить команду export.

[narad@tecmint ~]$ vi .bash_profile

.bash_profile

Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

User specific environment and startup programs

export HISTCONTROL=ignoredups

PATH=$PATH:$HOME/bin
export PATH

7. Список выполненных команд конкретного пользователя

Как просмотреть историю команд, выполненных конкретным пользователем. Bash хранит историю в файле ~/.bash_history. Мы можем просмотреть или открыть файл, чтобы увидеть историю команд.

[narad@tecmint ~]$ vi .bash_history

cd /tmp/
cd logstalgia-1.0.3/
./configure
sudo passwd root
apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc
./configure
make
apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc++
apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc
apt-get install make
mysql -u root -p
apt-get install grsync
apt-get install unison
unison

8. Отключить сохранение истории команд.

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

[narad@tecmint ~]$ vi .bash_profile

.bash_profile

Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

User specific environment and startup programs

PATH=$PATH:$HOME/bin
HISTSIZE=0
export PATH
.bash_profile (END)

Сохраните файл и загрузите изменения с помощью команды ниже.

[narad@tecmint ~]$ source .bash_profile

Примечание. Если вы не хотите, чтобы система запоминала введенные вами команды, просто выполните приведенную ниже команду, которая мгновенно отключит или остановит запись истории.

[narad@tecmint ~]$ export HISTSIZE=0

Советы. Найдите «HISTSIZE» и отредактируйте файл «/etc/profile» с правами суперпользователя. Изменение файла будет иметь глобальный эффект.

9. Удалить или очистить историю команд.

С помощью стрелок вверх и вниз мы можем увидеть ранее использованные команды, которые могут быть вам полезны или могут вас разозлить. Удаление или очистка всех записей из списка истории bash с помощью опций «-c».

[narad@tecmint ~]$ history -c

10. Поиск команд в истории с помощью команды Grep

Выполните поиск через «.bash_history», передав файл истории в «grep», как показано ниже. Например, приведенная ниже команда выполнит поиск и найдет команду «pwd» в списке истории.

[narad@tecmint ~]$ history | grep pwd

  113  2013-06-09 10:40:12     pwd
  141  2013-06-09 10:40:12     pwd
  198  2013-06-09 15:46:23     history | grep pwd
  202  2013-06-09 15:47:39     history | grep pwd

11. Поиск последней выполненной команды

Найдите ранее выполненную команду с помощью команды ’Ctrl+r’. Найдя нужную команду, нажмите «Enter», чтобы выполнить ее, иначе нажмите «esc», чтобы отменить ее.

(reverse-i-search)`source ': source .bash_profile

12. Вызов последней выполненной команды.

Вызов ранее использованной конкретной команды. Комбинация команд Bang и 8 (!8) вызовет команду номер 8, которую вы выполнили.

[narad@tecmint ~]$ !8

13. Вызов последней выполненной конкретной команды

Вспомните ранее использованную команду (netstat -np | grep 22) с помощью «!», после которой следует несколько букв этой конкретной команды.

[narad@tecmint ~]$ !net
netstat -np | grep 22
(No info could be read for "-p": geteuid()=501 but you should be root.)
tcp        0     68 192.168.50.2:22             192.168.50.1:1857           ESTABLISHED -
tcp        0      0 192.168.50.2:22             192.168.50.1:2516           ESTABLISHED -
unix  2      [ ]         DGRAM                    12284  -                   @/org/freedesktop/hal/udev_event
unix  3      [ ]         STREAM     CONNECTED     14522  -
unix  2      [ ]         DGRAM                    13622  -
unix  3      [ ]         STREAM     CONNECTED     12250  -                   @/var/run/hald/dbus-ujAjOMNa0g
unix  3      [ ]         STREAM     CONNECTED     12249  -
unix  3      [ ]         STREAM     CONNECTED     12228  -                   /var/run/dbus/system_bus_socket
unix  3      [ ]         STREAM     CONNECTED     12227  -

Мы постарались подчеркнуть силу управления историей. Однако это еще не конец. Пожалуйста, поделитесь с нами своим опытом использования истории в поле для комментариев ниже.