6 устаревших команд Linux и инструментов

747
6 устаревших команд Linux и инструментов
6 устаревших команд Linux и инструментов

6 устаревших команд Linux и инструментов, которые следует использовать вместо них.

При разработке программного обеспечения все меняется с невероятной скоростью из-за усовершенствования оборудования и сред. По той же причине меняются и инструменты. Иногда старые инструменты плохо адаптируются к изменениям, поэтому в конечном итоге они исчезают и заменяются другими утилитами (при этом спорным является вопрос о том, что новые инструменты лучше предыдущих).

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

egrep и fgrep: используйте вместо них флаги

Популярная команда grep является одним из лучших примеров философии операционной системы Unix:

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

Инструмент egrep (расширенный grep) использует регулярные выражения для поиска строк. Однако egrep был упразднен в пользу использования регулярного grep с флагом grep -E. Например:

$ egrep '^[fj]' /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
josevnz:x:1000:1000:josevnz:/home/josevnz:/bin/bash

$ grep -E '^[fj]' /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
josevnz:x:1000:3000:josevnz:/home/josevnz:/bin/bash

Оба примера соответствуют строкам, начинающимся с буквы j или f в файле /etc/passwd.

Шпаргалка по команде grep в Linux

Команда grep – это способ поиска в файле определенного набора символов.

Скачать шпаргалку grep

Другим примером добавления нового флага является fgrep. Команда fixed grep использует фиксированную строку для поиска (без оптимизаций, поэтому быстрее, чем regexp), в отличие от -E. Она была заменена на grep -F. Вот сравнение:

$ fgrep 'josevnz' /etc/passwd
josevnz:x:1000:3000:josevnz:/home/josevnz:/bin/bash

$ grep -F 'josevnz' /etc/passwd
josevnz:x:1000:3000:josevnz:/home/josevnz:/bin/bash

Почему заменили egrep и fgrep?

Логичнее использовать флаги для инструмента, чтобы обеспечить аналогичное поведение. Вам просто нужно знать, что grep с флагом может использовать регулярные выражения или выполнять точный поиск.

nslookup: все еще жив

Поднимите руку, если вы когда-нибудь пытались получить IP-адрес таким образом:

$ nslookup kodegeek.com
Server:		192.168.1.1
Address:	192.168.1.1#53

Non-authoritative answer:
Name:	kodegeek.com
Address: 50.63.7.206

Альтернативой nslookup  является dig. Вот пример, аналогичный приведенному выше:

$ dig @192.168.1.1 kodegeek.com A +noall +answer +nocmd
kodegeek.com.		600	IN	A	50.63.7.206

Ниже показано, как получить запись указателя (PTR) того же сервера (это обратный поиск для получения имени сервера по IP-адресу):

> set type=ptr
> 50.63.7.206
Server:		192.168.1.1
Address:	192.168.1.1#53

Non-authoritative answer:
206.7.63.50.in-addr.arpa	name = ip-50-63-7-206.ip.secureserver.net.

Authoritative answers can be found from:

Аналог команды  dig выглядит следующим образом:

$ dig -x @192.168.1.1 kodegeek.com +noall +answer +nocmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 22696
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;1.1.168.\@192.in-addr.arpa.	IN	PTR

;; AUTHORITY SECTION:
in-addr.arpa.		3549	IN	SOA	b.in-addr-servers.arpa. nstld.iana.org. 2022033331 1800 900 604800 3600

;; Query time: 24 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue May 17 05:08:21 EDT 2022
;; MSG SIZE  rcvd: 122

kodegeek.com.		600	IN	A	50.63.7.206

Команда dig может делать то, что не может  nslookup. Например, вы можете запросить DNS-передачу доменной зоны (включая все типы записей) для создания резервной копии вашего DNS-домена:

$ dig +short ns kodegeek.com
ns51.domaincontrol.com.
ns52.domaincontrol.com.
$ dig axfr kodegeek.com @ns51.domaincontrol.com.
# *Note:* In this case it won't work because kodegeek.com has a domain protection. But the domain in your intranet may work.

Однако nslookup может делать то, чего не может dig, например, дружественный интерактивный режим, который очень полезен при исследовании доменных зон DNS. Он также может работать в неинтерактивном режиме.

Так в чем же разница? Утилита digиспользует библиотеки resolver операционной системы (библиотеки, выполняющие поиск адресов в DNS), а  nslookup – нет. Эти две утилиты могут вести себя по-разному при преобразовании адресов.

Почему заменили nslookup?

На самом деле, nslookup не был заменен на dig (илиhost). Согласно Wikipedia:

nslookup входил в состав программного обеспечения сервера имен BIND. В начале… разработки BIND 9 Консорциум интернет-систем планировал отказаться от nslookup в пользу host и dig. Это решение было отменено в 2004 году с выходом BIND 9.3, и с тех пор nslookup полностью поддерживается.

Поэтому совершенно нормально использовать оба варианта.

ifconfig, netstat, route: попробуйте ip

Вы можете использовать ifconfig  для получения информации о сетевых интерфейсах и изменения их настроек. Например:

$ /sbin/ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:43:f9:d0:b4  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp1s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 00:1f:f3:46:38:96  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 30  bytes 1170 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 30  bytes 1170 (1.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wls1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.16  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::ac00:48ea:c7a6:1488  prefixlen 64  scopeid 0x20<link>
        inet6 fd22:4e39:e630:1:6688:3ffd:ea5b:d9e9  prefixlen 64  scopeid 0x0<global>
        ether 00:23:6c:7b:db:ac  txqueuelen 1000  (Ethernet)
        RX packets 1115786  bytes 107099421 (102.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 548530  bytes 359598134 (342.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Однако ifconfigбыл заменен на ip. Вот как можно вывести список сетевых интерфейсов с помощью ip:

$ ip address 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 00:1f:f3:46:38:96 brd ff:ff:ff:ff:ff:ff
3: wls1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:23:6c:7b:db:ac brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.16/24 brd 192.168.1.255 scope global noprefixroute wls1
       valid_lft forever preferred_lft forever
    inet6 fd22:4e39:e630:1:6688:3ffd:ea5b:d9e9/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::ac00:48ea:c7a6:1488/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:43:f9:d0:b4 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Еще одним полезным инструментом является route. Используйте следующую команду для проверки таблицы маршрутизации (информация о том, как ваша машина соединяется с другими машинами):

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    600    0        0 wls1
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.1.0     0.0.0.0         255.255.255.0   U     600    0        0 wls1

Команда ip  также может показать таблицу маршрутизации. Следующий пример показывает, зачем нужен этот инструмент:

$ ip route list
default via 192.168.1.1 dev wls1 proto static metric 600 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.1.0/24 dev wls1 proto kernel scope link src 192.168.1.16 metric 600

Еще одна утилита, которая была заменена, – netstat. С помощью netstat вы можете просмотреть список активных соединений, среди прочего. Например, чтобы посмотреть список активных прослушиваемых TCP-соединений на ваших серверах без разрешения имен, введите:

$ /usr/bin/netstat --numeric --tcp --listen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 :::9323                 :::*                    LISTEN     
tcp6       0      0 :::5355                 :::*                    LISTEN     
tcp6       0      0 :::9100                 :::*                    LISTEN

В этом случае заменой является командаss :

$ ss --numeric --tcp --listen
State               Recv-Q               Send-Q                             Local Address:Port                             Peer Address:Port              Process              
LISTEN              0                    32                                 192.168.122.1:53                                    0.0.0.0:*
LISTEN              0                    4096                               127.0.0.53%lo:53                                    0.0.0.0:*
LISTEN              0                    128                                      0.0.0.0:22                                    0.0.0.0:*
LISTEN              0                    128                                    127.0.0.1:631                                   0.0.0.0:*
LISTEN              0                    4096                                     0.0.0.0:5355                                  0.0.0.0:*
LISTEN              0                    128                                         [::]:22                                       [::]:*
LISTEN              0                    128                                        [::1]:631                                      [::]:*
LISTEN              0                    4096                                           *:9323                                        *:*
LISTEN              0                    4096                                        [::]:5355                                     [::]:*
LISTEN              0                    4096                                           *:9100                                        *:*

Почему ifconfig, route и netstat устарели?

В данном случае отсутствие технической поддержки стало причиной отказа от этих инструментов. На их место пришли более новые инструменты, согласно Википедии:

Многие дистрибутивы Linux отказались от использования ifconfig и route в пользу программного пакета iproute2, например, ArchLinux или RHEL с версии 7, который был доступен с 1999 года для Linux 2.2. iproute2 включает поддержку всех общих функций ifconfig(8), route(8), arp(8) и netstat(1). Среди прочих возможностей он также включает поддержку конфигурации многоадресной рассылки, управление туннелями и виртуальными каналами, контроль трафика и низкоуровневую конфигурацию IPsec.

Подводим итоги

  • Важно следить за новейшими инструментами, так как разработчики исправляют ошибки и добавляют полезные функции, которых может не быть в старых версиях. Главное – быть более продуктивным.
  • Старое программное обеспечение, как правило, не получает исправлений ошибок. Если оставить его без внимания, некоторые из них могут скомпрометировать вашу систему.
  • И не каждое утверждение о том, что инструмент устарел, соответствует действительности!