Могу ли я закрыть соединение, установленное другим процессом - PullRequest
0 голосов
/ 30 сентября 2019

Я застрял с программой, которая должна показывать информацию обо всех локальных адресах и удаленных адресах, 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 оказывает влияние прямо на этот объект. Так есть ли способ закрыть существующие соединения?

1 Ответ

0 голосов
/ 30 сентября 2019

Я не знаю ни одной библиотеки Python для закрытия произвольного TCP-соединения с локальной конечной точкой. Тем не менее, существуют программы с этой функциональностью - например, tcpkill (часть dsniff) и ss (часть iproute2). Вы можете запустить их с любой из библиотек Python для запуска дочерних процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...