Кто-нибудь знает, как закрыть сокет TCP или UDP для одного подключения через командную строку Windows?
Погуглив об этом, я увидел, что некоторые люди спрашивают то же самое. Но ответы выглядели как справочная страница команд netstat или netsh, посвященных мониторингу портов. Я не хочу ответов о том, как их контролировать (я уже делаю это). Я хочу закрыть / убить их.
РЕДАКТИРОВАТЬ, для пояснения: допустим, мой сервер прослушивает TCP-порт 80. Клиент устанавливает соединение, и для него выделен порт 56789. Затем я обнаруживаю, что это соединение нежелательно (например, этот пользователь делает плохие вещи, мы попросили его прекратить, но соединение не пропало где-то по пути). Обычно я бы добавил брандмауэр для выполнения этой работы, но это заняло бы некоторое время, и я попал в чрезвычайную ситуацию. Уничтожение процесса, которому принадлежит соединение, является действительно плохой идеей, потому что это приведет к отключению сервера (все пользователи потеряют функциональность, когда мы просто хотим выборочно и временно отключить это одно соединение).
источник
Ответы:
Да, это возможно Вы не должны быть текущим процессом, владеющим сокетом, чтобы закрыть его. Подумайте на мгновение, что удаленный компьютер, сетевая карта, сетевой кабель и ваша ОС могут привести к закрытию сокета.
Также учтите, что программное обеспечение Fiddler и Desktop VPN может вставлять себя в сетевой стек и показывать вам весь ваш трафик или перенаправлять весь ваш трафик.
Поэтому все, что вам действительно нужно, это либо для Windows предоставить API, который позволяет это напрямую, либо для того, чтобы кто-то написал программу, которая работает в некоторой степени подобно VPN или Fiddler, и дает вам возможность закрыть сокеты, которые проходят через нее.
Есть по крайней мере одна программа ( CurrPorts ), которая делает именно это, и я использовал ее сегодня с целью закрытия определенных сокетов в процессе, который был запущен до запуска CurrPorts. Для этого, конечно, вы должны запустить его как администратор.
Обратите внимание, что, вероятно, нелегко заставить программу не прослушивать порт (ну, это возможно, но эта возможность называется брандмауэром ...), но я не думаю, что об этом спрашивали здесь. Я считаю, что вопрос «как выборочно закрыть одно активное соединение (сокет) с портом, который слушает моя программа?». Формулировка вопроса немного неправильна, потому что указан номер порта для нежелательного входящего клиентского соединения, и он упоминался как «порт», но довольно ясно, что это была ссылка на этот один сокет, а не на прослушивающий порт.
источник
открыто
cmd
введите
netstat -a -n -o
найти
TCP [the IP address]:[port number] .... #[target_PID]#
(то же самое для UDP)(Кстати,
kill [target_PID]
у меня не работает)CTRL + ALT + DELETE и выберите «запустить диспетчер задач»
Нажмите на вкладку "Процессы"
Включите столбец «PID», выбрав: Вид> Выбрать столбцы> Установите флажок для PID
Найдите интересующий PID и «КОНЕЦ ПРОЦЕССА»
Теперь вы можете без проблем перезапустить сервер на [IP-адрес]: [номер порта]
источник
System
процесс, который обрабатывает сетевые подключения Windows.taskkill /pid 6168 /f
6168 - это pidНапример, вы хотите освободить порт 8080. Затем выполните следующие команды.
Готово!
источник
Если вы знаете порт, который хотите освободить, вы можете отсортировать список netstat, выполнив поиск указанного порта следующим образом:
Затем на правой стороне появится пид, который вы можете убить с помощью taskkill.
Также вы можете захотеть взглянуть на этот вопрос, который специально для localhost, но я думаю, что это актуально:
источник
Используйте TCPView: http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
или CurrPorts: https://www.nirsoft.net/utils/cports.html.
В качестве альтернативы, если вы не хотите использовать ВНЕШНЕЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ (эти инструменты, кстати, не требуют установки), вы можете просто ПЕРВЫЙ выполнить команду netstat (предпочтительно netstat -b) и затем настроить локальную политику безопасности, чтобы заблокировать IP-адрес. адрес компьютера пользователя, о котором идет речь, это то, что я делал с нежелательными или даже неизвестными соединениями - это позволяет вам делать все без какого-либо внешнего программного обеспечения (все идет с Windows) ...
источник
Попробуйте инструменты TCPView (GUI) и Tcpvcon (командная строка) от Sysinternals / Microsoft.
https://docs.microsoft.com/en-us/sysinternals/downloads/tcpview
источник
Вы не можете закрыть сокеты, не закрыв процесс, которому принадлежат эти сокеты. Сокеты принадлежат процессу, который их открыл. Итак, чтобы узнать идентификатор процесса (PID) для Unix / Linux. Используйте netstat так:
Это напечатает что-то вроде:
Где -a печатает все сокеты, -n показывает номер порта, -p показывает PID, -l показывает только то, что слушает (это необязательно в зависимости от того, что вы ищете).
Реальная информация, которую вы хотите, это PID. Теперь мы можем остановить этот процесс, выполнив:
Если вы закрываете сервис, лучше использовать:
Убийство буквально убивает только этот процесс и всех детей, которыми он владеет. При использовании команды service запускается сценарий завершения работы, зарегистрированный в каталоге init.d. Если вы используете kill для службы, она может не запуститься должным образом, потому что вы не выключили ее должным образом. Это зависит только от сервиса.
К сожалению, Mac отличается от Linux / Unix в этом отношении. Вы не можете использовать netstat. Прочитайте этот учебник, если вы заинтересованы в Mac:
http://www.tech-recipes.com/rx/227/find-out-which-process-is-holding-which-socket-open/
А если вы работаете в Windows, используйте TaskManager для уничтожения процессов, а пользовательский интерфейс служб - для отключения служб. Вы можете использовать netstat в Windows так же, как Linux / Unix, чтобы идентифицировать PID.
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true
источник
Используйте CurrPorts (это бесплатно и не требует установки): http://www.nirsoft.net/utils/cports.html
/close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name}
Примеры:
Он также имеет приятный графический интерфейс с функциями поиска и фильтрации.
Примечание. Этот ответ является ответом и комментарием от Huntharo и JasonXA, которые составлены и упрощены, чтобы облегчить читателям. Примеры взяты с веб-страницы CurrPorts.
источник
Вы не можете закрыть сокеты на вашем сервере, не имея этих сокетов, следовательно, вы не можете закрыть сокет, не запустив код в процессе, который владеет сокетом сервера.
Однако есть еще одна опция, которая говорит клиенту закрыть свой сокет. Отправка пакета RST TCP в порт, к которому подключается клиент, приведет к тому, что клиент прервет свое соединение. Вы можете сделать это с помощью сканирования RST, используя nmap.
http://nmap.org/
источник
Я нашел правильный ответ на этот. Попробуйте TCPView от Sysinternals, который сейчас принадлежит Microsoft. Вы можете найти его на http://technet.microsoft.com/en-us/sysinternals/bb897437
источник
wkillcx - это надежный инструмент командной строки Windows для уничтожения tcp-соединений из командной строки, который не был упомянут. Однако иногда возникают проблемы с серверами с большим количеством соединений. Я иногда использую tcpview для интерактивных убийств, но wkillcx можно использовать в скриптах.
источник
Чтобы закрыть порт, вы можете определить процесс, который прослушивает этот порт, и завершить этот процесс.
источник
Вы можете использовать программу, такую как tcpview от sysinternal. Я думаю, это может помочь вам как в мониторинге, так и в уничтожении нежелательных соединений.
источник
CurrPorts не работает для нас, и мы можем получить доступ к серверу только через ssh, так что нет TCPView. Мы также не могли убить процесс, чтобы не сбрасывать другие соединения. То, что мы в итоге сделали, и нам еще не предложили, было заблокировать соединение в брандмауэре Windows. Да, это заблокирует все соединения, которые соответствуют правилу, но в нашем случае было одно соединение (которое нас интересовало):
Замените IP тем, который вам нужен, и добавьте другие правила, если это необходимо.
источник
мгновенный / выполнимый / частичный ответ : https://stackoverflow.com/a/20130959/2584794 в
отличие от предыдущего ответа, в котором использовался netstat -a -o -n, нужно было просматривать невероятно длинный список без названия приложения, использующего те порты
источник
Да есть возможность закрыть порт TCP или UDP есть команда в DOS
Я надеюсь, что это будет работать для вас
источник
Если вы работаете в Windows 8, `Windows Server 2012 или выше с установленной PowerShell v4 выше, вы можете использовать приведенный ниже скрипт. Он находит процессы, связанные с портом, и завершает их.
Код
Документация:
NetStat
эквивалент PowerShellTaskKill
эквивалент PowerShellисточник