通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python如何查看网络连接

python如何查看网络连接

Python可以通过多种方式查看网络连接、包括使用psutil库、使用socket库、使用subprocess库调用系统命令等。其中,使用psutil库的方式最为简便和直观。psutil库可以跨平台地获取系统和进程的相关信息,包括网络连接状况。以下是详细介绍:

psutil库的使用

psutil是一个跨平台的库,专门用于获取系统的各种信息,包括CPU、内存、磁盘、网络、进程等。使用psutil库可以非常方便地查看当前系统中的网络连接状态。

安装psutil库

首先需要安装psutil库。可以使用pip来安装:

pip install psutil

查看网络连接状态

安装完成后,可以通过psutil库来获取网络连接的信息。以下是一个简单的示例代码:

import psutil

def get_network_connections():

connections = psutil.net_connections()

for conn in connections:

print(f"fd: {conn.fd}, family: {conn.family}, type: {conn.type}, laddr: {conn.laddr}, raddr: {conn.raddr}, status: {conn.status}, pid: {conn.pid}")

get_network_connections()

以上代码将输出系统中的所有网络连接信息,包括文件描述符、协议族、类型、本地地址、远程地址、连接状态和进程ID等。

详细描述:

在上面的代码中,psutil.net_connections()函数返回一个包含所有网络连接信息的列表。每个网络连接信息是一个_common.sconn对象,包含以下属性:

  • fd:文件描述符
  • family:协议族(如IPv4、IPv6)
  • type:套接字类型(如TCP、UDP)
  • laddr:本地地址(包含IP和端口)
  • raddr:远程地址(包含IP和端口,如果有)
  • status:连接状态(如LISTEN、ESTABLISHED、CLOSE_WAIT等)
  • pid:关联的进程ID

通过遍历这些连接信息,可以获取系统中所有网络连接的详细状态。

其他方法:

虽然psutil是最常用且方便的方法,但在某些情况下,可能需要使用其他方法来查看网络连接状态。

使用socket库

socket库是Python标准库的一部分,提供了底层的网络接口。虽然它不像psutil那样直接提供查看网络连接的方法,但可以用来编写网络工具。例如,可以用来创建一个简单的端口扫描器。

import socket

def scan_ports(host, port_range):

open_ports = []

for port in port_range:

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.settimeout(1)

if s.connect_ex((host, port)) == 0:

open_ports.append(port)

return open_ports

open_ports = scan_ports('127.0.0.1', range(1, 1024))

print(f"Open ports: {open_ports}")

以上代码扫描指定主机的指定端口范围,返回打开的端口列表。

使用subprocess库调用系统命令

有时候直接调用系统命令可以获取更详细的网络连接信息。例如,在Linux系统上,可以调用netstatss命令。

import subprocess

def get_network_connections():

result = subprocess.run(['netstat', '-tunlp'], stdout=subprocess.PIPE)

print(result.stdout.decode('utf-8'))

get_network_connections()

以上代码调用netstat命令,输出当前系统中的网络连接信息,包括监听的端口和相关的进程信息。

小结:

通过以上几种方法,可以在Python中查看网络连接状态。psutil库提供了最方便和直观的方法,适用于大多数场景。socket库和subprocess库提供了更多的灵活性,可以根据需要编写自定义的网络工具。


一、psutil库的详细使用

1、安装和基本使用

psutil库是一个跨平台的Python库,可以方便地获取系统的各种信息,包括CPU、内存、磁盘、网络、进程等。安装psutil库非常简单,可以通过pip安装:

pip install psutil

安装完成后,可以通过导入psutil库来使用其提供的各种功能。例如,可以获取系统的CPU使用率、内存使用情况、磁盘使用情况等。

import psutil

获取CPU使用率

cpu_percent = psutil.cpu_percent(interval=1)

print(f"CPU使用率: {cpu_percent}%")

获取内存使用情况

memory_info = psutil.virtual_memory()

print(f"总内存: {memory_info.total}, 可用内存: {memory_info.available}")

获取磁盘使用情况

disk_usage = psutil.disk_usage('/')

print(f"总磁盘空间: {disk_usage.total}, 已用磁盘空间: {disk_usage.used}")

2、获取网络连接信息

psutil库提供了获取网络连接信息的功能,可以通过psutil.net_connections()函数来获取系统中的所有网络连接信息。每个网络连接信息是一个_common.sconn对象,包含以下属性:

  • fd:文件描述符
  • family:协议族(如IPv4、IPv6)
  • type:套接字类型(如TCP、UDP)
  • laddr:本地地址(包含IP和端口)
  • raddr:远程地址(包含IP和端口,如果有)
  • status:连接状态(如LISTEN、ESTABLISHED、CLOSE_WAIT等)
  • pid:关联的进程ID

通过遍历这些连接信息,可以获取系统中所有网络连接的详细状态。

import psutil

def get_network_connections():

connections = psutil.net_connections()

for conn in connections:

print(f"fd: {conn.fd}, family: {conn.family}, type: {conn.type}, laddr: {conn.laddr}, raddr: {conn.raddr}, status: {conn.status}, pid: {conn.pid}")

get_network_connections()

3、筛选特定的网络连接

在实际使用中,可能只需要查看特定类型的网络连接。例如,只查看TCP连接或只查看处于ESTABLISHED状态的连接。可以通过对psutil.net_connections()返回的连接信息进行筛选来实现。

import psutil

def get_tcp_connections():

connections = psutil.net_connections(kind='tcp')

for conn in connections:

print(f"fd: {conn.fd}, family: {conn.family}, type: {conn.type}, laddr: {conn.laddr}, raddr: {conn.raddr}, status: {conn.status}, pid: {conn.pid}")

def get_established_connections():

connections = psutil.net_connections()

established_connections = [conn for conn in connections if conn.status == 'ESTABLISHED']

for conn in established_connections:

print(f"fd: {conn.fd}, family: {conn.family}, type: {conn.type}, laddr: {conn.laddr}, raddr: {conn.raddr}, status: {conn.status}, pid: {conn.pid}")

get_tcp_connections()

get_established_connections()

以上代码分别筛选出系统中的TCP连接和处于ESTABLISHED状态的连接。


二、socket库的详细使用

1、创建和使用套接字

socket库是Python标准库的一部分,提供了底层的网络接口。可以使用socket库来创建和使用套接字,实现网络通信。以下是一个简单的示例,展示如何创建一个TCP服务器和客户端。

服务器端代码:

import socket

def start_server(host='127.0.0.1', port=65432):

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.bind((host, port))

s.listen()

print(f"Server listening on {host}:{port}")

conn, addr = s.accept()

with conn:

print(f"Connected by {addr}")

while True:

data = conn.recv(1024)

if not data:

break

conn.sendall(data)

start_server()

客户端代码:

import socket

def start_client(host='127.0.0.1', port=65432):

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.connect((host, port))

s.sendall(b'Hello, world')

data = s.recv(1024)

print(f"Received {data}")

start_client()

以上代码实现了一个简单的回显服务器和客户端。服务器监听指定的IP和端口,接收客户端发送的数据并原样返回。客户端连接到服务器,发送一条消息并接收服务器的响应。

2、端口扫描器

可以使用socket库编写一个简单的端口扫描器,扫描指定主机的指定端口范围,找出打开的端口。

import socket

def scan_ports(host, port_range):

open_ports = []

for port in port_range:

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.settimeout(1)

if s.connect_ex((host, port)) == 0:

open_ports.append(port)

return open_ports

open_ports = scan_ports('127.0.0.1', range(1, 1024))

print(f"Open ports: {open_ports}")

以上代码遍历指定的端口范围,尝试连接每个端口。如果连接成功,则表示该端口是打开的。

3、获取本地IP地址

可以使用socket库获取本地机器的IP地址。例如,可以获取本地机器的主机名和IP地址。

import socket

def get_local_ip():

hostname = socket.gethostname()

ip_address = socket.gethostbyname(hostname)

print(f"Hostname: {hostname}, IP Address: {ip_address}")

get_local_ip()

以上代码获取本地机器的主机名和IP地址,并打印出来。


三、subprocess库的详细使用

1、调用系统命令

subprocess库是Python标准库的一部分,用于执行外部系统命令。可以使用subprocess.run()函数来调用系统命令,并获取命令的输出。例如,可以调用netstat命令来查看当前系统中的网络连接信息。

import subprocess

def get_network_connections():

result = subprocess.run(['netstat', '-tunlp'], stdout=subprocess.PIPE)

print(result.stdout.decode('utf-8'))

get_network_connections()

以上代码调用netstat命令,输出当前系统中的网络连接信息,包括监听的端口和相关的进程信息。

2、解析命令输出

在某些情况下,可能需要对命令的输出进行解析。例如,可以解析netstat命令的输出,提取出特定的信息。

import subprocess

import re

def parse_netstat_output():

result = subprocess.run(['netstat', '-tunlp'], stdout=subprocess.PIPE)

output = result.stdout.decode('utf-8')

lines = output.split('\n')

for line in lines:

if 'tcp' in line or 'udp' in line:

parts = re.split(r'\s+', line)

if len(parts) >= 7:

protocol = parts[0]

local_address = parts[3]

remote_address = parts[4]

pid = parts[6] if len(parts) == 7 else parts[6] + ' ' + parts[7]

print(f"Protocol: {protocol}, Local Address: {local_address}, Remote Address: {remote_address}, PID: {pid}")

parse_netstat_output()

以上代码解析netstat命令的输出,提取出协议、本地地址、远程地址和进程ID等信息,并打印出来。

3、使用其他系统命令

除了netstat命令,还可以使用其他系统命令来获取网络连接信息。例如,在Linux系统上,可以使用ss命令。

import subprocess

def get_network_connections():

result = subprocess.run(['ss', '-tunlp'], stdout=subprocess.PIPE)

print(result.stdout.decode('utf-8'))

get_network_connections()

以上代码调用ss命令,输出当前系统中的网络连接信息。

4、结合psutil和subprocess

在实际使用中,可以结合psutilsubprocess库,获取更详细的网络连接信息。例如,可以使用psutil获取连接信息,然后使用subprocess获取对应的进程信息。

import psutil

import subprocess

def get_network_connections():

connections = psutil.net_connections()

for conn in connections:

if conn.pid:

result = subprocess.run(['ps', '-p', str(conn.pid), '-o', 'comm='], stdout=subprocess.PIPE)

process_name = result.stdout.decode('utf-8').strip()

print(f"PID: {conn.pid}, Process: {process_name}, Local Address: {conn.laddr}, Remote Address: {conn.raddr}, Status: {conn.status}")

get_network_connections()

以上代码结合psutilsubprocess库,获取网络连接的详细信息,包括进程名称。


四、其他网络相关工具

1、使用scapy库

scapy是一个强大的网络数据包处理库,可以用于生成、解析和发送网络数据包。可以使用scapy库编写各种网络工具,例如抓包工具、网络扫描器等。

安装scapy库

可以通过pip安装scapy库:

pip install scapy

抓包工具

以下是一个简单的抓包工具,使用scapy库抓取网络数据包,并解析和打印数据包信息。

from scapy.all import sniff, IP, TCP

def packet_handler(packet):

if packet.haslayer(IP):

ip_layer = packet.getlayer(IP)

print(f"New Packet: {ip_layer.src} -> {ip_layer.dst}")

if packet.haslayer(TCP):

tcp_layer = packet.getlayer(TCP)

print(f"TCP {tcp_layer.sport} -> {tcp_layer.dport}")

sniff(prn=packet_handler, count=10)

以上代码抓取10个网络数据包,并解析和打印数据包的IP层和TCP层信息。

2、使用nmap库

nmap是一个流行的网络扫描工具,可以用于端口扫描、主机发现、操作系统检测等。可以使用nmap库编写Python脚本,调用nmap命令并解析结果。

安装nmap库

可以通过pip安装python-nmap库:

pip install python-nmap

端口扫描器

以下是一个简单的端口扫描器,使用nmap库扫描指定主机的端口。

import nmap

def scan_ports(host, port_range):

nm = nmap.PortScanner()

nm.scan(host, port_range)

for host in nm.all_hosts():

print(f"Host: {host} ({nm[host].hostname()})")

for proto in nm[host].all_protocols():

print(f"Protocol: {proto}")

ports = nm[host][proto].keys()

for port in ports:

state = nm[host][proto][port]['state']

print(f"Port: {port}, State: {state}")

scan_ports('127.0.0.1', '1-1024')

以上代码使用nmap库扫描指定主机的端口,并打印出端口的状态。

3、使用requests库

requests库是一个简单易用的HTTP库,可以用于发送HTTP请求和处理HTTP响应。可以使用requests库编写网络工具,例如HTTP客户端、API接口测试工具等。

安装requests库

可以通过pip安装requests库:

pip install requests

发送HTTP请求

以下是一个简单的示例,展示如何使用requests库发送HTTP GET请求,并处理HTTP响应。

import requests

def fetch_url(url):

response = requests.get(url)

print(f"Status Code: {response.status_code}")

print(f"Headers: {response.headers}")

print(f"Content: {response.text}")

fetch_url('https://www.example.com')

以上代码发送一个HTTP GET请求到指定的URL,并打印响应的状态码、头部信息和内容。

4、使用paramiko库

paramiko是一个用于SSH连接和SFTP传输的库,可以用于远程管理和文件传输。可以使用paramiko库编写网络工具,例如远程执行命令、上传和下载文件等。

安装paramiko库

可以通过pip安装paramiko库:

pip install paramiko

远程执行命令

以下是一个简单的示例,展示如何使用paramiko

相关问答FAQs:

如何使用Python检查当前活动的网络连接?
可以使用Python的socketpsutil库来检查当前的网络连接。psutil库提供了一个简单的接口来获取系统的网络连接状态。通过调用psutil.net_connections(),你可以获得所有活动的网络连接及其状态。确保在运行代码之前已经安装了psutil库。

使用Python监控特定端口的网络连接是否正常?
可以使用socket库中的connect_ex方法来监控特定端口的连接状态。通过尝试连接到目标IP和端口,如果返回值为0,则表示连接正常;如果返回值为其他数字,则说明连接失败。这种方法适合于检测特定服务的可用性。

Python是否可以用来分析网络流量?
是的,Python可以使用scapy库来分析网络流量。scapy是一个强大的网络包处理工具,允许用户捕获、创建和解析网络数据包。通过利用sniff()函数,可以捕获实时的网络流量并进行分析,帮助用户了解网络的使用情况和潜在的安全问题。

相关文章