Làm thế nào bạn có thể tìm ra quá trình đang lắng nghe trên một cổng trên Windows?
Làm thế nào bạn có thể tìm ra quá trình đang lắng nghe trên một cổng trên Windows?
Câu trả lời:
Get-Process -Id (Get-NetTCPConnection -LocalPort portNumber).OwningProcess
C:\> netstat -a -b
(Thêm -n để ngăn chặn nó cố gắng giải quyết tên máy chủ, điều này sẽ làm cho nó nhanh hơn rất nhiều.)
Lưu ý đề xuất của Dane cho TCPView . Có vẻ rất hữu ích!
-a Hiển thị tất cả các kết nối và cổng nghe.
-b Hiển thị tệp thực thi liên quan đến việc tạo từng kết nối hoặc cổng nghe. Trong một số trường hợp, các tệp thực thi nổi tiếng lưu trữ nhiều thành phần độc lập và trong các trường hợp này, chuỗi các thành phần liên quan đến việc tạo kết nối hoặc cổng nghe được hiển thị. Trong trường hợp này, tên thực thi nằm ở [] ở phía dưới, trên cùng là thành phần mà nó được gọi, và cứ thế cho đến khi đạt được TCP / IP. Lưu ý rằng tùy chọn này có thể tốn thời gian và sẽ thất bại trừ khi bạn có đủ quyền.
-n Hiển thị địa chỉ và số cổng ở dạng số.
-o Hiển thị ID tiến trình sở hữu được liên kết với mỗi kết nối.
1234
- sau đó bạn có thể sử dụng tasklist /fi "pid eq 1234"
để tìm ra tên và các chi tiết khác của quy trình.
Có một GUI gốc cho Windows:
Hoặc Chạy resmon.exe
hoặc từ tab hiệu suất của Trình quản lý tác vụ .
Sử dụng TCPView nếu bạn muốn có GUI cho việc này. Đây là ứng dụng Sysiternals cũ mà Microsoft đã mua.
Cho cửa sổ:
netstat -aon | find /i "listening"
netstat -aon | find /i "abhören"
cho tiếng Đức.
FIND: Parameter format not correct
Công tắc -b được đề cập trong hầu hết các câu trả lời yêu cầu bạn phải có quyền quản trị trên máy. Bạn không thực sự cần quyền nâng cao để có được tên quy trình!
Tìm pid của quá trình đang chạy trong số cổng (ví dụ: 8080)
netstat -ano | findStr "8080"
Tìm tên quá trình bằng pid
tasklist /fi "pid eq 2216"
Bạn có thể nhận thêm thông tin nếu bạn chạy lệnh sau:
netstat -aon | find /i "listening" |find "port"
sử dụng lệnh 'Tìm' cho phép bạn lọc kết quả. find /i "listening"
sẽ chỉ hiển thị các cổng đang 'Nghe'. Lưu ý, bạn cần /i
bỏ qua trường hợp, nếu không bạn sẽ gõ "LISTENING". | find "port"
sẽ giới hạn kết quả chỉ những kết quả có chứa số cổng cụ thể. Lưu ý, về điều này, nó cũng sẽ lọc các kết quả có số cổng ở bất cứ đâu trong chuỗi phản hồi.
FIND: Parameter format not correct
. Bạn cần thêm một khoảng trắng sau khi tìm tiêu chí. Điều này sẽ để lại cho bạn với netstat -aon | find /i "listening" | find "1234 "
.
{back tick}
'lắng nghe {back tick}
'' | tìm' {back tick}
'cổng {back tick}
' "(<- lưu ý các trích dẫn đã thoát - xin lỗi back tick
vì tôi không thể thêm ký tự thực tế vì nó nghĩ rằng đó là một đoạn trích)
Mở cửa sổ nhắc lệnh (với tư cách Quản trị viên) Từ "Bắt đầu \ Hộp tìm kiếm" Nhập "cmd", sau đó nhấp chuột phải vào "cmd.exe" và chọn "Chạy với tư cách Quản trị viên"
Nhập văn bản sau, sau đó nhấn Enter.
netstat -abno
-a Hiển thị tất cả các kết nối và cổng nghe.
-b Hiển thị tệp thực thi liên quan đến việc tạo từng kết nối hoặc cổng nghe. Trong một số trường hợp, các tệp thực thi nổi tiếng lưu trữ nhiều thành phần độc lập và trong các trường hợp này, chuỗi các thành phần liên quan đến việc tạo kết nối hoặc cổng nghe được hiển thị. Trong trường hợp này, tên thực thi nằm ở [] ở phía dưới, trên cùng là thành phần mà nó được gọi, và cứ thế cho đến khi đạt được TCP / IP. Lưu ý rằng tùy chọn này có thể tốn thời gian và sẽ thất bại trừ khi bạn có đủ quyền.
-n Hiển thị địa chỉ và số cổng ở dạng số.
-o Hiển thị ID tiến trình sở hữu được liên kết với mỗi kết nối.
Tìm Cổng mà bạn đang nghe trong "Địa chỉ cục bộ"
Nhìn vào tên quá trình trực tiếp dưới đó.
LƯU Ý: Để tìm quy trình trong Trình quản lý tác vụ
Lưu ý PID (mã định danh quy trình) bên cạnh cổng bạn đang xem.
Mở Trình quản lý tác vụ Windows.
Chọn tab Quy trình.
Tìm kiếm PID mà bạn đã lưu ý khi bạn thực hiện netstat ở bước 1.
Nếu bạn không thấy cột PID, bấm vào Xem / Chọn Cột. Chọn PID.
Hãy chắc chắn rằng các quy trình của Show Show từ tất cả người dùng được chọn.
Chỉ sử dụng một lệnh:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /FI "PID eq %a"
nơi 9000
nên được thay thế bằng số cổng của bạn.
Đầu ra sẽ chứa một cái gì đó như thế này:
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
java.exe 5312 Services 0 130,768 K
Giải trình:
nó lặp qua mỗi dòng từ đầu ra của lệnh sau:
netstat -aon | findstr 9000
từ mỗi dòng, PID ( %a
- tên không quan trọng ở đây) được trích xuất (PID là phần tử 5
thứ trong dòng đó) và được truyền cho lệnh sau
tasklist /FI "PID eq 5312"
Nếu bạn muốn bỏ qua các tiêu đề và sự trở lại của dấu nhắc lệnh , bạn có thể sử dụng:
echo off & (for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /NH /FI "PID eq %a") & echo on
Đầu ra:
java.exe 5312 Services 0 130,768 K
findstr :9000
nếu không, thậm chí bạn sẽ tìm thấy các ứng dụng chứa số (ví dụ: khi bạn tìm kiếm "80", bạn cũng sẽ tìm thấy các ứng dụng trên cổng 80, 800, 8000).
Đầu tiên chúng ta tìm id tiến trình của tác vụ cụ thể mà chúng ta cần loại bỏ để có được cổng miễn phí:
Kiểu
netstat -n -a -o
Sau khi thực hiện lệnh này trong dấu nhắc dòng lệnh Windows (cmd), chọn pid mà tôi nghĩ là cột cuối cùng. Giả sử đây là 3312.
Bây giờ gõ
taskkill /F /PID 3312
Bây giờ bạn có thể kiểm tra chéo bằng cách gõ netstat
lệnh.
LƯU Ý: đôi khi Windows không cho phép bạn chạy lệnh này trực tiếp trên CMD, vì vậy trước tiên bạn cần thực hiện các bước sau:
Từ menu start -> dấu nhắc lệnh (nhấp chuột phải vào dấu nhắc lệnh và chạy với tư cách quản trị viên)
Để có danh sách tất cả các ID quy trình sở hữu được liên kết với mỗi kết nối:
netstat -ao |find /i "listening"
Nếu muốn giết bất kỳ tiến trình nào có ID và sử dụng lệnh này, để cổng đó trở nên miễn phí
Taskkill /F /IM PID of a process
Rất đơn giản để lấy số cổng từ một PID trong Windows.
Sau đây là các bước:
Đi để chạy → gõ cmd → nhấn Enter.
Viết lệnh sau ...
netstat -aon | findstr [port number]
(Lưu ý: Không bao gồm dấu ngoặc vuông.)
Nhấn Enter...
Sau đó cmd sẽ cung cấp cho bạn chi tiết về dịch vụ đang chạy trên cổng đó cùng với bộ vi xử lý.
Mở Trình quản lý tác vụ và nhấn tab dịch vụ và khớp với PID với cmd, và đó là nó.
Chỉ cần mở một vỏ lệnh và gõ (nói rằng cổng của bạn là 123456):
netstat -a -n -o | find "123456"
Bạn sẽ thấy mọi thứ bạn cần.
Các tiêu đề là:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
Điều này như được đề cập ở đây .
findstr 123456
(không có dấu ngoặc kép) hoặc find "123456"
(có dấu ngoặc kép). (
Để tìm hiểu quá trình cụ thể (PID) đang sử dụng cổng nào:
netstat -anon | findstr 1234
Trong đó 1234 là PID của quá trình của bạn. [Chuyển đến Trình quản lý tác vụ → tab Dịch vụ / Quy trình để tìm hiểu PID của ứng dụng của bạn.]
-n
đặt cờ hai lần. -ano
Là đủ.
Với PowerShell 5 trên Windows 10 hoặc Windows Server 2016, hãy chạy Get-NetTCPConnection
lệnh ghép ngắn. Tôi đoán rằng nó cũng sẽ hoạt động trên các phiên bản Windows cũ hơn.
Đầu ra mặc định Get-NetTCPConnection
không bao gồm Process ID bởi một số lý do và nó hơi khó hiểu. Tuy nhiên, bạn luôn có thể lấy nó bằng cách định dạng đầu ra. Các tài sản bạn đang tìm kiếm là OwningProcess
.
Nếu bạn muốn tìm ra ID của quá trình đang nghe trên cổng 443, hãy chạy lệnh này:
PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-List
LocalAddress : ::
LocalPort : 443
RemoteAddress : ::
RemotePort : 0
State : Listen
AppliedSetting :
OwningProcess : 4572
CreationTime : 02.11.2016 21:55:43
OffloadState : InHost
Định dạng đầu ra cho một bảng với các thuộc tính bạn tìm kiếm:
PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess
LocalAddress LocalPort State OwningProcess
------------ --------- ----- -------------
:: 443 Listen 4572
0.0.0.0 443 Listen 4572
Nếu bạn muốn tìm ra tên của quá trình, hãy chạy lệnh này:
PS C:\> Get-Process -Id (Get-NetTCPConnection -LocalPort 443).OwningProcess
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
143 15 3448 11024 4572 0 VisualSVNServer
Nếu bạn muốn sử dụng một công cụ GUI để thực hiện điều này thì có TCPView của Sysiternals .
Nhập lệnh: netstat -aon | findstr :DESIRED_PORT_NUMBER
Ví dụ: nếu tôi muốn tìm cổng 80: netstat -aon | findstr :80
Câu trả lời này ban đầu được đăng cho câu hỏi này .
Mở dấu nhắc lệnh - bắt đầu → Chạy → cmd
hoặc menu bắt đầu → Tất cả chương trình → Phụ kiện → Dấu nhắc lệnh .
Kiểu
netstat -aon | findstr '[port_number]'
Thay thế [port_number]
bằng số cổng thực tế mà bạn muốn kiểm tra và nhấn Enter.
Kiểu
tasklist | findstr '[PID]'
Thay thế [PID]
bằng số từ bước trên và nhấn Enter.
netstat -ao
và netstat -ab
cho bạn biết ứng dụng, nhưng nếu bạn không phải là quản trị viên hệ thống, bạn sẽ nhận được "Thao tác được yêu cầu yêu cầu độ cao".
Điều đó không lý tưởng, nhưng nếu bạn sử dụng Process Explorer của Sysiternals, bạn có thể đi đến các thuộc tính của các quy trình cụ thể và nhìn vào tab TCP để xem họ có đang sử dụng cổng mà bạn quan tâm hay không. Đó là một chút kim và haystack điều này, nhưng có lẽ nó sẽ giúp được ai đó ...
Tôi khuyên dùng CurrPorts từ NirSoft.
CurrPorts có thể lọc các kết quả được hiển thị. TCPView không có tính năng này.
Lưu ý: Bạn có thể nhấp chuột phải vào kết nối ổ cắm của quy trình và chọn "Đóng kết nối TCP được chọn" (Bạn cũng có thể thực hiện việc này trong TCPView). Điều này thường khắc phục các sự cố kết nối tôi gặp phải với Outlook và Lync sau khi tôi chuyển đổi VPN. Với CurrPorts, bạn cũng có thể đóng các kết nối từ dòng lệnh với tham số "/ close".
Một giải pháp đơn giúp tôi là giải pháp này. Chỉ cần thay 3000 bằng cổng của bạn:
$P = Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess; Stop-Process $P.Id
Chỉnh sửa: Thay đổi kill
thành Stop-Process
ngôn ngữ giống PowerShell hơn
Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess | Stop-Process
Thực hiện theo các công cụ sau: Từ cmd : C:\> netstat -anob
với đặc quyền Quản trị viên .
Tất cả từ sysiternals.com.
Nếu bạn chỉ muốn biết quá trình chạy và các chủ đề theo từng quy trình, tôi khuyên bạn nên tìm hiểu về wmic
. Nó là một công cụ dòng lệnh tuyệt vời, cung cấp cho bạn nhiều hơn những gì bạn có thể biết.
Thí dụ:
c:\> wmic process list brief /every:5
Lệnh trên sẽ hiển thị một danh sách tất cả quá trình ngắn gọn cứ sau 5 giây. Để biết thêm, bạn có thể chỉ cần sử dụng /?
lệnh của windows
c:\> wmic /?
c:\> wmic process /?
c:\> wmic prcess list /?
Vân vân và vân vân. :)
Sử dụng:
netstat -a -o
Điều này cho thấy PID của quá trình đang chạy trên một cổng cụ thể.
Hãy ghi nhớ ID tiến trình và chuyển đến Trình quản lý tác vụ và các tab dịch vụ hoặc chi tiết và kết thúc quá trình có cùng một PID.
Do đó, bạn có thể giết một tiến trình đang chạy trên một cổng cụ thể trong Windows.
Đối với những người sử dụng PowerShell, hãy thử Get-NetworkStatistics
:
> Get-NetworkStatistics | where Localport -eq 8000
ComputerName : DESKTOP-JL59SC6
Protocol : TCP
LocalAddress : 0.0.0.0
LocalPort : 8000
RemoteAddress : 0.0.0.0
RemotePort : 0
State : LISTENING
ProcessName : node
PID : 11552
Về mặt lập trình, bạn cần những thứ từ iphlpapi.h , ví dụ GetTcpTable2 (). Các cấu trúc như MIB_TCP6law2 chứa PID của chủ sở hữu.
Sử dụng PowerShell ... ... đây sẽ là bạn của bạn (thay thế 8080 bằng số cổng của bạn):
netstat -abno | Select-String -Context 0,1 -Pattern 8080
Sản lượng mẫu
> TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 2920
[tnslsnr.exe]
> TCP [::]:8080 [::]:0 LISTENING 2920
[tnslsnr.exe]
Vì vậy, trong ví dụ này tnslsnr.exe (cơ sở dữ liệu OracleXE) đang lắng nghe trên cổng 8080.
Giải thích nhanh
Select-String
được sử dụng để lọc đầu ra dài netstat
cho các dòng liên quan.-Pattern
kiểm tra từng dòng chống lại một biểu thức chính quy.-Context 0,1
sẽ xuất ra 0 dòng hàng đầu và 1 dòng theo dõi cho mỗi mẫu phù hợp.Sử dụng tập lệnh bó bên dưới, lấy tên quy trình làm đối số và đưa netstat
ra kết quả cho quy trình.
@echo off
set procName=%1
for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq %1" /fo csv') do call :Foo %%~F
goto End
:Foo
set z=%1
echo netstat for : "%procName%" which had pid "%1"
echo ----------------------------------------------------------------------
netstat -ano |findstr %z%
goto :eof
:End
Dựa trên câu trả lời với thông tin và tiêu diệt , đối với tôi, việc kết hợp chúng trong một lệnh là rất hữu ích . Và bạn có thể chạy nó từ cmd để lấy thông tin về quá trình lắng nghe trên cổng đã cho (ví dụ 8080):
for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @tasklist /nh /fi "pid eq %i"
Hoặc nếu bạn muốn giết nó:
for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @Taskkill /F /IM %i
Bạn cũng có thể đặt các lệnh đó vào một tập tin bat (chúng sẽ hơi khác một chút - thay thế %i
cho %%i
):
portInfo.bat
for /f "tokens=3 delims=LISTENING" %%i in (
'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @tasklist /nh /fi "pid eq %%i"
portKill.bat
for /f "tokens=3 delims=LISTENING" %%i in (
'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @Taskkill /F /IM %%i
Sau đó, bạn từ cmd bạn có thể làm điều này:
portInfo.bat 8080
hoặc là
portKill.bat 8080
.\portInfo.bat 800
trong PowerShell, nó cung cấp một cái gì đó như thế này:C:\work>for /F "tokens=3 delims=LISTENING" %i in ('netstat -ano | findStr "800" | findStr "["') do (tasklist /fi "pid eq %i" ) C:\work>(tasklist /fi "pid eq 4" ) Image Name PID Session Name Session# Mem Usage ========================= ======== ================ =========== ============ System 4 Services 0 1,820 K
portInfo.bat
trong thiết bị đầu cuối powershell, sau đó thực thi .\portInfo.bat 8080
. Đầu ra chỉ là nội dung của tệp bó. Rất có khả năng tôi đang nhìn một cái gì đó. Lưu ý, tôi đang sử dụng PowerShell 6.2.3 trên Windows 10. Tôi cũng đã thử nó trong một dấu nhắc lệnh thông thường, nhưng kết quả là như nhau: Đầu ra nội dung của tập lệnh. Tôi chắc chắn rằng tôi đang thiếu một thông tin quan trọng để thực hiện công việc này.
/nh
: @tasklist /nh /fi "pid eq %i"
? Và chính xác là cánh cửa:Findstr ":8080"
Trong trường hợp của tôi, cổng (3000) hoàn toàn không được sử dụng và không hiển thị trong netstat. Nhưng! Trình gỡ cài đặt Docker cho Windows đã giải quyết vấn đề.