рекомендации

четверг, 6 августа 2020 г.

Эффективное использование истории команд в Linux

Большинство администраторов Linux-серверов проводят много времени в командной строке, поэтому история команд - важная вещь для них.

BASH (Bourne Again SHell) - это оболочка командной строки, которая используется по умолчанию в большинстве основных дистрибутивов Linux.

Что такое история команд

Команда history используется для отображения журнала команд Bash, которые вы набирали ранее. Этот журнал называется «историей», которая позволяет нам быстро увидеть, какие команды выполнялись ранее в системе. Когда вы закрываете сеанс терминала, BASH записывает все команды, которые вы выполнили, в файл ~/.bash_history.

Когда вы одновременно запускаете два сеанса, команда history отображает историю текущего сеанса и не показывает историю другого сеанса.

Как читать историю команд

Запустите команду history без каких-либо параметров для просмотра команд, которые вы запускали ранее. Если у вас огромные журналы истории команд, вы не можете их нормально просмотреть. В этом случае вы должны использовать команды просмотра файлов, такие как less, more и т. д.
# history
or
# history | more
or
# history | less
or
# history | head -20
or
# history | tail -15
  .
  .
  759  ls -lh
  760  touch magi.txt
  761  echo "Magi-Thanu" >>magi.txt
  762  cat magi.txt
  763  grep -r "Magi-Thanu" /
  764  grep -r "Magi-Thanu" / 2> /dev/null
  765  grep -r /* | grep "Magi-Thanu" / 2> /dev/null
  766  grep -r /* | grep "Magi-Thanu"
  767  grep -r /* | grep "Magi-Thanu" 2> /dev/null
  768  find / -xdev -type f -print0 | xargs -0 grep -H "Magi-Thanu" 2> /dev/null
  769  grep -r /* | grep "Magi-Thanu" 2> /dev/null
  770  exit
  771  histor
  772  history
  773  hostname
  774  date
  775  uname -a
  776  history
Как просмотреть последние n команд

По умолчанию команда history показывает последние 1000 выполненных нами команд. Если вы хотите dsdtcnb только n команд, введите число n после команды history. Например, чтобы отобразить последние 10 команд, введите:
# history 10
  764  grep -r "Magi-Thanu" / 2> /dev/null
  765  grep -r /* | grep "Magi-Thanu" / 2> /dev/null
  766  grep -r /* | grep "Magi-Thanu"
  767  grep -r /* | grep "Magi-Thanu" 2> /dev/null
  768  find / -xdev -type f -print0 | xargs -0 grep -H "Magi-Thanu" 2> /dev/null
  769  grep -r /* | grep "Magi-Thanu" 2> /dev/null
  770  exit
  771  # history -10
  772  history -10
  773  history 10
Как повторно выполнить введенную ранее команду

С помощью клавиш стрелок вверх и вниз перейдите к нужной команде. Затем нажмите Enter, чтобы выполнить ее или клавиши со стрелками влево и вправо, чтобы отредактировать команду.

Повтор последней команды

Повторить последнюю команду, которую вы выполнили, введите !! - двойной восклицательный знак.
# uname -a
Linux vps138235 4.4.0-108-generic #131-Ubuntu SMP Sun Jan 7 14:34:49 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

# !!
uname -a
Linux vps138235 4.4.0-108-generic #131-Ubuntu SMP Sun Jan 7 14:34:49 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Как повторить последнюю команду, используя ее номер

Повторите ранее выполненную команду, используя ее номер. Это позволит быстро запустить ранее выполненную команду, вместо ввода всей команды.
# !774
uname -a
Linux vps138235 4.4.0-108-generic #131-Ubuntu SMP Sun Jan 7 14:34:49 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Поиск и выполнение ранее введенных команд

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

Чтобы выполнить эту операцию, я взял последние 30 команд в истории.
# history | tail -30
  751  du
  752  top -c
  753  cat /etc/*-release
  754  docker ps
  755  history
  756  docker run -ti fedora /bin/bash
  757  ls -lh
  758  cd /opt
  759  ls -lh
  760  touch magi.txt
  761  echo "Magi-Thanu" >>magi.txt
  762  cat magi.txt
  763  grep -r "Magi-Thanu" /
  764  grep -r "Magi-Thanu" / 2> /dev/null
  765  grep -r /* | grep "Magi-Thanu" / 2> /dev/null
  766  grep -r /* | grep "Magi-Thanu"
  767  grep -r /* | grep "Magi-Thanu" 2> /dev/null
  768  find / -xdev -type f -print0 | xargs -0 grep -H "Magi-Thanu" 2> /dev/null
  769  grep -r /* | grep "Magi-Thanu" 2> /dev/null
  770  exit
  771  # history -10
  772  history -10
  773  history 10
  774  uname -a
  775  history
  776  uname -a
  777  grep -r /* | grep "Magi-Thanu" 2> /dev/null
  778  history
  779  history | tail -25
  780  history | tail -30
1) Предположим, вы хотите запустить команду, которая соответствует строке в начале команды. Используйте приведенный ниже формат. В нем будет запущена последняя команда, начинающаяся со строки doc.

В моем случае она выполнит команду запуска docker, которая находится в строке 756.
# !doc
docker run -ti fedora /bin/bash
[root@54bc0e2c1323 /]# cat /etc/fedora-release
Fedora release 27 (Twenty Seven)
2) Если вы хотите запустить команду, которая соответствует заданной строке, используйте следующий формат команды:

В моем случае она выполнит команду docker ps, которая находится в строке 754.
# !? ps
or
# !? ps?
docker ps
CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS              PORTS                              NAMES
25431e3d61fc        rancher/scheduler:v0.8.3          "/.r/r /rancher-entr…"   5 days ago          Up About an hour                                       r-scheduler-scheduler-1-297af68f
5420cdb768bc        centos                            "/bin/bash"              5 days ago          Up 5 days                                              festive_colden
f453843a43f4        centos:latest                     "/bin/bash"              7 days ago          Up 7 days                                              gifted_kepler
6a385828575a        fedora                            "/bin/bash"              7 days ago          Up 7 days                                              dreamy_einstein
ca5148e8d4f6        centos                            "/bin/bash"              7 days ago          Up 7 days                                              nifty_joliot
6f49f5fd6e49        fedora                            "/bin/bash"              10 days ago         Up 7 days                                              tender_bhabha
73878066ab70        centos:latest                     "/.r/r /bin/bash"        2 weeks ago         Up 2 weeks                                             r-CentOS-2307d873
a8f8bda21205        rancher/healthcheck:v0.3.3        "/.r/r /rancher-entr…"   2 weeks ago         Up 2 weeks                                             r-healthcheck-healthcheck-2-9d8b4357
507817dbf425        rancher/network-manager:v0.7.19   "/rancher-entrypoint…"   2 weeks ago         Up 2 weeks                                             r-network-services-network-manager-2-b5a2e972
009034ba6536        rancher/net:v0.13.7               "/rancher-entrypoint…"   2 weeks ago         Up 2 weeks                                             r-ipsec-ipsec-connectivity-check-2-c5addb83
6fb051f8d176        rancher/net:v0.13.7               "/rancher-entrypoint…"   2 weeks ago         Up 2 weeks                                             r-ipsec-ipsec-router-2-ab035109
fdd5cd881fc1        rancher/dns:v0.15.3               "/rancher-entrypoint…"   2 weeks ago         Up 2 weeks                                             r-network-services-metadata-dns-2-44490e8d
26cf808ef887        rancher/net:holder                "/.r/r /rancher-entr…"   2 weeks ago         Up 2 weeks                                             r-ipsec-ipsec-2-ff75d784
8a82a7ae9192        rancher/metadata:v0.9.5           "/rancher-entrypoint…"   2 weeks ago         Up 2 weeks                                             r-network-services-metadata-2-d034268c
c2cc6d345430        rancher/net:v0.13.7               "/rancher-entrypoint…"   2 weeks ago         Up 2 weeks                                             r-ipsec-cni-driver-1-8c666e6b
3415a1fd101f        rancher/agent:v1.2.9              "/run.sh run"            2 weeks ago         Up 2 weeks                                             rancher-agent
008e8d292f46        rancher/server:stable             "/usr/bin/entry /usr…"   3 weeks ago         Up 5 days           3306/tcp, 0.0.0.0:8080->8080/tcp   sharp_hypatia
Как заменить строку и выполнить ранее введенную команду

Если вы хотите повторить последнюю команду с новой строкой, просто замените string1 на string2 (эквивалентно «!!:s/string1/string2/»).

Используйте следующий формат команды. В приведенном ниже примере сначала я запустил образ Fedora docker, а затем запустил образ Centos docker, заменив строку Fedora на CentOS.
# !794
docker run -ti fedora /bin/bash
[root@029af8069eaa /]# uname -a
Linux 029af8069eaa 4.4.0-108-generic #131-Ubuntu SMP Sun Jan 7 14:34:49 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@029af8069eaa /]# exit
exit

# ^fedora^centos
docker run -ti centos /bin/bash
[root@710ea49f548b /]# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
[root@710ea49f548b /]# exit
exit
Если вы хотите запустить какую-либо конкретную команду, которая была выполнена ранее, с новой строкой, используйте один из следующих форматов команды.

В моем случае строка 821 истории команд была fedora docker container. Чтобы запустить centos container, просто замените слово fedora на centos.
# !821:s|fedora|centos
docker run -ti centos /bin/bash
[root@e37a89af2959 /]# exit
exit

or

# !821:s/fedora/centos
docker run -ti centos /bin/bash
[root@050610f3198b /]#
Вывод подходящих строк с помощью команды grep

Если вы запускали много команд помимо docker, можно очень легко отобразить список команд, соответствующих команде docker, используя команду grep.
# history | grep docker
   23  docker ps
   24  docker images
   25  docker pull centos
   26  docker ps
  503  docker --version
  504  docker ps
  505  docker pull fedora
  506  docker pull debian
  507  docker pull archlinux
  508  docker pull arch
  509  docker pull arch linux
  510  docker pull opensuse
  516  docker run -ti fedora /bin/bash
  517  docker run -ti debian /bin/bash
  518  docker run -ti centos /bin/bash
Как в истории команд отобразить дату и время

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

Если вы хотите добавить дату и время в выводе истории команд, просто перейдите по следующей ссылке.


Как использовать историю команд YUM для отката обновлений

Yum (Yellowdog Update Modified) - утилита для управления пакетами RPM в системах CentOS и Red Hat, история команд Yum позволяет администратору откатить систему в предыдущее состояние, но из-за некоторых ограничений откат работает не во всех ситуациях, то есть команда yum может просто ничего не делать, или она может удалить не те пакеты, которые вы ожидаете.

Как просмотреть историю команд других пользователей

Используйте следующий формат команды, чтобы просмотреть историю команд других пользователей:
# more /home/$USER/.bash_history
Как искать в истории Bash

Мы можем выполнить поиск ранее выполненной команды с использованием ключевого слова, нажав CTRL-r (этот поиск отображает самый последний найденный результат). Нажмите CTRL-r еще раз, чтобы увидеть следующий результат.
# 
(reverse-i-search)`dock': docker run -ti centos /bin/bash

Комментариев нет:

Отправить комментарий