ss -tulpn — прямая замена netstat -tulpn, и она уже установлена. netstat приходил в пакете net-tools, который современные минимальные системы и образы контейнеров намеренно не включают, так что ставить его — лечить симптом. Маршруты тоже переехали: netstat -r теперь ip route.
1. Почему команда исчезла
$ 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 покажи кто слушает порт 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 покажи соединения на порт 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 покажи сводку по сокетам→ ss -sTotal: 2161TCP: 190 (estab 58, closed 108, orphaned 0, timewait 29)
Первая строка считает все сокеты машины, вторая разбивает TCP по состояниям. Большое число timewait — норма, большое orphaned — повод пойти посмотреть на приложение.
5. netstat -r заменяет ip, а не ss
$ 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 перечисли замены 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
- Проверить, открыт ли порт
- Команды Windows и что им соответствует в Linux
- Измерить задержку API через curl
CliAI пишет фильтр ss за вас, пока пальцы всё ещё набирают netstat, и показывает команду до запуска. Поставить одной строкой.