我拥有 BSD/GNU/Linux 命令行经验。例如
ps aux | grep 'USER\|http'
,打印出包含单词“USER”的标题或任何包含“http”的行。
(反斜杠转义管道符号或竖线执行或部分 - “|”)
是否有与find
Windows 中的命令等效的命令?
例如,Windows 10 命令提示符:获取其中包含数字 443 的监听端口行列表:
netstat -aonp TCP | find "443"
我想通过包含以单词 Proto 作为第一列的标题行(Proto Local Address Foreign Address State PID)来对其进行 OR 运算
我知道我不能使用反斜杠,因为它在 Windows 中的含义不同。不知道 Windows 中“|”的等价符号表示“或”。
它是否类似于... find "443" -o "Proto"
Cmd 或 Powershell?
答案1
答案2
使用 PowerShell 并netstat
结合Select-String
netstat -aonp TCP | Select-String -Pattern "443","Proto" -NoEmphasis
答案3
您还可以使用 RegEx 匹配对事物进行“或”操作。
(netstat -aonp TCP) -match 'proto|135|443'
在 DOS/CMD.exe 中,它有点麻烦,您更倾向于使用“FINDSTR”而不是“FIND”。例如:
netstat -aonp TCP | findstr /i /c:"proto" /c:"135" /c:"443"
# Create your own object to manipulate
Clear-Host
(((netstat -aonp TCP |
Select-Object -Skip 3).trim()) -replace '\s\s+', ',') |
ConvertFrom-Csv |
Format-Table -AutoSize
# Results
<#
Proto Local Address Foreign Address State PID
----- ------------- --------------- ----- ---
TCP 0.0.0.0:7 0.0.0.0:0 LISTENING 6892
TCP 0.0.0.0:9 0.0.0.0:0 LISTENING 6892
TCP 0.0.0.0:13 0.0.0.0:0 LISTENING 6892
...
#>
Clear-Host
(((netstat -aonp TCP |
Select-Object -Skip 3).trim()) -replace '\s\s+', ',') |
ConvertFrom-Csv |
Select-Object -Property '*' |
Where-Object {$PSitem.'Foreign Address' -match '135|443'} |
Format-Table -AutoSize
# Results
<#
Proto Local Address Foreign Address State PID
----- ------------- --------------- ----- ---
TCP 10.0.0.xxx:5xxx xx.xx.240.xxx:443 ESTABLISHED 5716
TCP 10.0.0.xxx:5xxx xxx.xx.163.xxx:443 CLOSE_WAIT 19916
TCP 10.0.0.xxx:5xxx xxx.xx.163.xxx:443 CLOSE_WAIT 19916
...
#>
仅供参考,如其他人或指出
全部都是PS。也可以看看:
Get-NetTCPConnection |
Where-Object {$PSitem.RemotePort -match '445|443'}
答案4
这不是您所提问题的答案,但一般来说,在(非古老的)Windows 上,您在 Unix 上以文本形式执行的许多操作都可以在 PowerShell 中使用正确输入的数据来完成,这更像是 SQL 或 JSON,而不是 shell。对于这种情况:
您可以使用“cmdlet”get-nettcpconnection,而不是运行程序(netstat)来获取有关 TCP 连接(或更确切地说是套接字端点)的信息
您无需在文本输出中搜索子字符串,而是可以进行过滤值。我假设你使用了,
-a
因为你想包含处于监听状态的套接字,并且真的想使用来查找进程(进程?)本地端口443 不是远程的。添加-localport 443
会进行此过滤 - 并且不包括使用端口 4437 或 14430 或 22443 或具有进程号4430 或偏僻的端口 443 或 4439,文本搜索会包含这些端口,但您实际上并不想要。另一方面,如果您实际上想要远程端口 443(这实际上没有意义-a
),请执行-remoteport 443
。默认情况下,nettcpconnection 结构不显示所属进程,但可以使用 format-table 进行覆盖,它会自动提供标题行,并且可以通过不同的 cmdlet get-process 获取有关进程的其他信息
作为一个实际的例子,我在 443 上没有任何内容,但是在 7022 上有一个虚拟机在监听:
PS C:\work> get-nettcpconnection -localport 7022 |format-table localaddress,localport,owningprocess
localaddress localport owningprocess
------------ --------- -------------
0.0.0.0 7022 12132
PS C:\work> get-process -id 12132
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
1093 63 124696 91768 43.00 12132 1 VirtualBoxVM
您可以自定义有关进程的信息,甚至将它们组合成一个管道,以获取套接字信息和进程信息,但我需要更精确的要求。