CLI AI

netstat: command not found — пользуйтесь ss

2026-07-16

ss -tulpn — прямая замена netstat -tulpn, и она уже установлена. netstat приходил в пакете net-tools, который современные минимальные системы и образы контейнеров намеренно не включают, так что ставить его — лечить симптом. Маршруты тоже переехали: netstat -r теперь ip route.

1. Почему команда исчезла

clai
$ clai покажи слушающие порты→ netstat -tulpnbash: line 1: netstat: command not found

net-tools не развивается годами, поэтому его выкидывают из лёгких образов. Внутри контейнера apt-get install net-tools часто отвечает E: Unable to locate package net-tools — ставить нечего, и не о чем жалеть: ss приходит из iproute2, который на месте.

2. Прямая замена netstat -tulpn

clai
$ clai покажи кто слушает порт 8099→ ss -tulpn 'sport = :8099'Netid State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess                              tcp   LISTEN 0      5          127.0.0.1:8099      0.0.0.0:*    users:(("python3",pid=1034062,fd=3))

Флаги те же, что вы уже знаете: -t tcp, -u udp, -l слушающие, -p процесс, -n без резолва имён. Новое здесь — 'sport = :8099': это фильтр, который считает сам ss, а не grep по выводу.

3. Посмотреть, кто реально подключён

clai
$ clai покажи соединения на порт 8099→ ss -tan 'dport = :8099 or sport = :8099'State     Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN    0      5          127.0.0.1:8099      0.0.0.0:*    TIME-WAIT 0      0          127.0.0.1:8099    127.0.0.1:51350

У netstat языка фильтров не было вовсе, поэтому всё заканчивалось пайпом в grep. Здесь state established, state time-wait, dport и sport соединяются через and и or.

4. Сводка вместо netstat -s

clai
$ clai покажи сводку по сокетам→ ss -sTotal: 2161TCP:   190 (estab 58, closed 108, orphaned 0, timewait 29)

Первая строка считает все сокеты машины, вторая разбивает TCP по состояниям. Большое число timewait — норма, большое orphaned — повод пойти посмотреть на приложение.

5. netstat -r заменяет ip, а не ss

clai
$ clai покажи таблицу маршрутизации→ ip routedefault via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 scope link  src 172.17.0.2

Маршруты, интерфейсы и адреса ушли в ip: netstat -r — это ip route, netstat -i — ip -s link, ifconfig — ip addr. За ss остались только сокеты.

6. Вся таблица перевода

clai
$ clai перечисли замены ss для флагов netstat, которыми я пользуюсь→ ss -tulpn        # netstat -tulpn→ ss -an           # netstat -an→ ss -s            # netstat -s→ ip route         # netstat -r→ ip -s link       # netstat -i→ ip maddr         # netstat -g

Шесть строк закрывают всё, что большинство когда-либо набирало в netstat. Если ss -s слишком грубо, длинные счётчики протоколов даёт nstat.

Gotchas

  • Без root колонка Process пуста для чужих процессов. Свои сокеты всегда показывают users:(("name",pid=…)), остальные требуют sudo. Пустой Process у занятого порта почти всегда значит «процесс не ваш», а не «процесса нет».
  • Непрерывного режима нет. У netstat был -c для повтора каждую секунду; в ss --help ничего подобного нет. Повторяйте снаружи: watch -n1 'ss -tan'.
  • Скобки в фильтре нужно закавычить. ss -tan 'sport = :8099' работает и без кавычек — шелл просто передаёт три слова. А ss -tan ( sport = :8099 ) до ss вообще не доходит: шелл падает с syntax error near unexpected token '('. Кавычьте выражение целиком и не думайте об этом.

Related questions

А если netstat всё-таки нужен? sudo apt install net-tools вернёт его на полноценной системе, но в лёгких образах пакета нет вовсе. Выучить шесть строк таблицы выше — путь короче.

Чем смотреть трафик по процессам? ss показывает соединения, а не скорость. Для скорости нужен nethogs или счётчики в /proc/<pid>/net/dev.

Самый короткий способ найти, кто держит порт? ss -tulpn | grep :8099 — годится, когда не хочется вспоминать синтаксис фильтров.

See also

CliAI пишет фильтр ss за вас, пока пальцы всё ещё набирают netstat, и показывает команду до запуска. Поставить одной строкой.