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

от автора

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

«Все новое — лучше, чем старое» — девиз, который не всегда применим для утилит в Linux. Но все же исключения есть.

В статье под катом разработчик Хосе Висенте Нуньес* рассказывает о нескольких устаревших инструментах, которые вы, возможно, все еще используете. А также о том, чем их можно заменить. Автор объясняет, почему вам следует переключиться на эти улучшенные альтернативы, которые обеспечивают ту же — а в некоторых случаях даже большую — функциональность. Список составлен в произвольном порядке.

*Обращаем ваше внимание, что позиция автора может не всегда совпадать с мнением МойОфис.


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

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

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

Инструмент egrep (extended 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.

Чтобы получить больше примеров, скачайте эту шпаргалку: Linux grep command cheat sheet.

Другой пример, добавление нового флага — fgrep. Команда fixed grep использует фиксированную строку для сопоставления (без оптимизации, поэтому она быстрее, чем регулярное выражение). Утилита fgrep легко заменяется на 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: «I’ll be back»

Введите «Y», если вы когда-либо пытались получить 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.600INA50.63.7.206

Еще один пример. Ниже в интерактивном режиме показано, как получить запись указателя (PTR) того же сервера:

> 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.arpaname = 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.INPTR  ;; AUTHORITY SECTION: in-addr.arpa.3549INSOAb.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.600INA50.63.7.206

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

$ 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. Также nslookup может работать в неинтерактивном режиме.

В чем же разница? Утилита dig использует системные библиотеки операционной системы для разрешения имен (local Domain Name System resolver library), а nslookup — нет. В результате они могут вести себя по-разному при выполнении запросов.

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

На самом деле nslookup планировался к выводу, но не был заменен на dig (или host). Обратимся к «Википедии«:

nslookup — программное обеспечение сервера имен BIND. В начале… при разработке BIND 9 Internet Systems Consortium (ISC) планировал отказаться от nslookup в пользу host и dig. Это решение было отменено в 2004 году с выпуском BIND 9.3, и с тех пор остается неизменным.

Так что, зная особенности, вполне логично использовать оба инструмента.

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-соединений (listening) на вашем сервере без разрешения имен, введите:

$ /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 (например, ArchLinux, RHEL 7 и выше) отказались от использования ifconfig и route в пользу программного пакета iproute2, который включает поддержку всех общих функций ifconfig(8), route(8), arp(8) и netstat(1). Он также включает в себя поддержку multicast-конфигурации, управление туннелями и виртуальными ссылками, контроль трафика, низкоуровневую настройку IPsec и другие функции.

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

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

  • Старое программное обеспечение, как правило, не получает исправления багов. Ваша система может оказаться под угрозой.

  • Как мы убедились на примере nslookup, не каждое заявление о том, что инструмент устарел, верно. В рамках домашнего задания советую вам убедиться, что ваши утилиты находятся в актуальном состоянии.

***

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


ссылка на оригинал статьи https://habr.com/ru/company/ncloudtech/blog/699536/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *