Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python端口扫描器_Python_Sockets_Port - Fatal编程技术网

Python端口扫描器

Python端口扫描器,python,sockets,port,Python,Sockets,Port,我是python的新手,在某一点上被卡住了。我想只使用python 3内置库创建端口扫描程序(意味着避免scapy等),我有以下代码: import socket for i in range(1,26): s = socket.socket() s.settimeout(0.5) ip = "74.207.244.221" #scanme.nmap.org response = s.connect_ex((ip, i)) if response: pr

我是python的新手,在某一点上被卡住了。我想只使用python 3内置库创建端口扫描程序(意味着避免scapy等),我有以下代码:

import socket
for i in range(1,26):  
  s = socket.socket()  
  s.settimeout(0.5)
  ip = "74.207.244.221" #scanme.nmap.org
  response = s.connect_ex((ip, i)) 
  if response:
      print ("%d\tclose" %i)
  else:
      print ("%d\topen" %i)
  s.close()
现在,我想在此基础上添加两个功能:即

  • 区分关闭端口和过滤端口。在这两种情况下,我都会收到相同的errno,那么我如何检查我是否收到了rst数据包或什么都没有?据我所知,s.recv()不适用于此
  • 我想控制尝试次数,也就是说,我只想发送一个或两个syn数据包。我不希望这个程序发送超过2个syn包用于探测。如何才能做到这一点
  • 区分关闭端口和过滤端口。在这两种情况下,我 收到相同的errno作为回报,那么我如何检查是否收到 退回一个rst包,否则什么也不退回

    您可能只检查过发送RST的服务器。以下是我尝试过的:

    • 第一种情况,正常配置:

      >>> os.strerror(s.connect_ex((ip, 81)))
      'Connection refused'
      
    • 其次,对于手动iptables:

      iptables -A OUTPUT -p tcp --dport 81 -j DROP
      
      >>> os.strerror(s.connect_ex((ip, 81)))
      'Resource temporarily unavailable'
      
    我想控制尝试次数,即我想发送 只有一个或两个syn数据包

    我认为没有公开的
    setsockopt
    TCP选项,但在linux上有:

    net.ipv4.tcp_syn_retries
    

    但是,由于您限制了套接字的超时,所有未在0.5秒内完成的操作都将超时。因此,很可能只有1或2个SYN将离开工作站。

    我希望现有的每个端口扫描仪都能比声誉为1的新手编写的代码工作得更好。虽然此代码可能会回答这个问题,但提供有关此代码为什么和/或如何回答这个问题的附加上下文可以提高其长期价值。
    #!/usr/bin/python
    
    import socket
    
    s = socket.socket(socket.AF_INET, socekt.SOCK_STREAM)
    host = 74.207.244.221
    
    def portscan(port):
        try:
            s.connect((host,port))
            return True
        else:
            return False
    for x in range(1,255):
        if portscan(x):
            print('Port',x,'Is Open')