Определите процесс, используя порт без sudo

11

Я хотел бы узнать, какой процесс (в частности, идентификатор процесса) использует данный порт. Единственная проблема в том, что я не хочу использовать sudo, и я не вошел в систему как root. Процессы, для которых я хочу, чтобы это работало, выполняются тем же пользователем, которому я хочу найти идентификатор процесса - поэтому я бы подумал, что это было просто.

И то, lsofи другое netstatне сообщит мне идентификатор процесса, если я не запущу их с помощью sudo - они скажут, что порт используется.

В качестве некоторого дополнительного контекста - у меня есть различные приложения, все подключающиеся через SSH к серверу, которым я управляю, и создающие обратный порт для пересылки. После того, как они настроены, мой сервер выполняет некоторую обработку, используя перенаправленный порт, и затем соединение может быть разорвано. Если я могу сопоставить определенные порты (каждое приложение имеет свои) процессам, это простой сценарий. Какие-либо предложения?

Кстати, это на Ubuntu, но я предполагаю, что любое решение будет стандартным для большинства дистрибутивов Linux.

похлопывание
источник

Ответы:

7

--programВариант NETSTAT показывает вам PIDs и имена ваших собственных процессов. Эта опция присутствует и работает на RHEL 6 в netstat 1.42 из net-tools 1.60.

Я подтвердил, что netstat -an --tcp --programпоказывает мне PID моих процессов.

Павел Бродацкий
источник
1
Я думаю, что вы имели в виду -an. netstat -pantтакже работает, и это легче запомнить.
Эдуардо Иванец
Да, "-" закрался лишний. И мне нравится мнемоника.
Павел Бродацкий
Боюсь, что это не работает в Ubuntu - поскольку в некоторых случаях он не показывает процесс без root - и кажется, что SSH forward является одним из таких случаев.
погладить
Павел: теперь ОП наконец-то конкретизировал свой случай использования (см. Комментарий в моей цепочке), я призываю вас попробовать это снова. Я сделал это на CentOS 5 box (также netstat 1.42 от net-tools 1.60), и он терпит неудачу, как он говорит. Я был бы заинтересован в вашем опыте.
MadHatter
3

Мне кажется, что предложение Павла прекрасно работает, но в качестве альтернативы вот я слушаю из shell1:

[madhatta@risby ~]$ nc -l  localhost 3456

и вот я вижу это lsofиз shell2:

[madhatta@risby tmp]$ lsof -i tcp:3456
COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nc      18109 madhatta    3u  IPv4 69205153      0t0  TCP localhost.localdomain:vat (LISTEN)

Изменить : вы пишете в комментарии, что

Переадресация SSH должна вести себя по-разному - даже если процесс принадлежит одному и тому же пользователю, я не вижу его вообще в выводе lsof, если я не запустил его как root / sudo.

но это не так для меня. Воспользовавшись ssh для пересылки локального порта 8001 ssh vpn.example.com -L 8001:rt.int:80, я нахожу:

[madhatta@risby ~]$ lsof -n -i tcp:8001
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     5375 madhatta    8u  IPv6 381234      0t0  TCP [::1]:vcom-tunnel (LISTEN)
ssh     5375 madhatta    9u  IPv4 381235      0t0  TCP 127.0.0.1:vcom-tunnel (LISTEN)

Не могли бы вы показать нам некоторые ваши выходные данные, желательно не слишком сильно отредактированные?

Безумный Шляпник
источник
1
Похоже, что переадресация SSH должна вести себя по-разному - даже если процесс принадлежит одному и тому же пользователю, я не вижу его в списке вообще, lsofесли не запускаю его от имени root / sudo.
Пэт
Я не получаю вывод lsof на перенаправленном порту при запуске от имени пользователя. Если я запускаю его с помощью sudo, то вижу вывод, очень похожий на то, что вы добавили в свой ответ. Единственная заметная разница - я вижу фактический номер порта вместо vcom-tunnel.
Пэт
Кроме того, это дистанционная пересылка, а не локальная переадресация - возможно, в этом источник разницы? Или вы тестировали с дистанционным форвардом?
Пэт
Под удаленной пересылкой вы подразумеваете «с сервера AI ssh на сервер B, переадресация порта xxx с сервера B обратно на сервер A»? Если так, почему вы ожидаете получить что-нибудь с помощью netstat / lsof на сервере A? При этом не создается новый прослушиватель на сервере A, поэтому на сервере A не назначается порт (сохранение временно).
MadHatter
SSH от A до B, порт вперед от порта X на B к порту Y на C (который находится внутри брандмауэра A - следовательно, необходима переадресация), используя lsof / netstat на B для порта X.
pat