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 – это способ поиска в файле определенного набора символов.
Другим примером добавления нового флага является 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.
Подводим итоги
- Важно следить за новейшими инструментами, так как разработчики исправляют ошибки и добавляют полезные функции, которых может не быть в старых версиях. Главное – быть более продуктивным.
- Старое программное обеспечение, как правило, не получает исправлений ошибок. Если оставить его без внимания, некоторые из них могут скомпрометировать вашу систему.
- И не каждое утверждение о том, что инструмент устарел, соответствует действительности!