Я застрял с программой, которая должна показывать информацию обо всех локальных адресах и удаленных адресах, PID, а также отключать по требованию точно установленное соединение. Итак, я думаю, это должно быть как netscan. Можно ли закрыть порт (и отключить) без уничтожения процесса?
import os
import socket
import re
from socket import AF_INET, SOCK_STREAM, SOCK_DGRAM
import serial
import psutil as psutil
AD = "-"
AF_INET6 = getattr(socket, 'AF_INET6', object())
proto_map = {
(AF_INET, SOCK_STREAM): 'tcp',
(AF_INET6, SOCK_STREAM): 'tcp6',
(AF_INET, SOCK_DGRAM): 'udp',
(AF_INET6, SOCK_DGRAM): 'udp6',
}
def main():
templ = "%-5s %-30s %-30s %-13s %-6s %s"
print(templ % (
"Proto", "Local address", "Remote address", "Status", "PID",
"Program name"))
proc_names = {}
for p in psutil.process_iter(attrs=['pid', 'name']):
proc_names[p.info['pid']] = p.info['name']
for c in psutil.net_connections(kind='inet'):
laddr = "%s:%s" % (c.laddr)
raddr = ""
if c.raddr:
raddr = "%s:%s" % (c.raddr)
print(templ % (
proto_map[(c.family, c.type)],
laddr,
raddr or AD,
c.status,
c.pid or AD,
proc_names.get(c.pid, '?')[:15],
))
def closeConn(ip):
print("///////////////////////////////////////////////")
print("Trying to close connection:", ip)
print("///////////////////////////////////////////////")
ser = serial.Serial()
port = re.search(r":\d+", command).group(0)[1:]
ser.port = port
ser.close()
main()
if __name__ == '__main__':
main()
while True:
command = input()
if command == "quit":
break
if re.match(r"close", command):
connToClose = re.search(r"[^a-z, ]+", command)
if connToClose:
closeConn(connToClose.group(0))
else:
print("IP or Host cannot be empty... Enter new command. Example >>> close 192.168.0.1")
else:
print("Please enter valid command...")
Я пытался решить эту проблему с помощью serial, но, как я понимаю, serial - это новый изолированный объект, и его метод close
оказывает влияние прямо на этот объект. Так есть ли способ закрыть существующие соединения?