在 python 和 bash 中处理 IP 和端口

Mad*_*ddy 5 python bash ip-address

使用 python 和 bash,我想完成两件事:

  1. 需要将格式为 [fec2::10]:80 的 ipv6 地址和端口组合拆分为 fec2::10 和 80。

  2. 给定 IP 地址和端口组合,我需要确定 IP 是 v4 还是 v6 地址。例如:1.2.3.4:80 和 [fec2::10]:80

请提出一种方法来做到这一点。

谢谢!

示例代码:

#!/usr/bin/env python

import optparse

def main():
    server = "[fec1::1]:80"
    if server.find("[", 0, 2) == -1:
       print "IPv4"
       ip, port = server.split(':')
    else:
       print "IPv6"
       new_ip, port = server.rsplit(':', 1)
       print new_ip
       ip = new_ip.strip('[]')

    print ip
    print port

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

这适用于所有情况,除非指定了没有端口的输入。例如:10.78.49.50 和 [fec2::10]

有什么建议可以解决这个问题吗?

jfs*_*jfs 5

假设your_input"[fec2::10]:80"或者"1.2.3.4:80",很容易拆分端口并找出ip地址:

#!/usr/bin/env python3
from ipaddress import ip_address

ip, separator, port = your_input.rpartition(':')
assert separator # separator (`:`) must be present
port = int(port) # convert to integer
ip = ip_address(ip.strip("[]")) # convert to `IPv4Address` or `IPv6Address` 
print(ip.version) # print ip version: `4` or `6`
Run Code Online (Sandbox Code Playgroud)


Mad*_*ddy 0

这是我想出的代码。它看起来冗长而费力,但它解决了所有可能的输入场景。任何关于压缩/更好的建议都是非常受欢迎的:)

#!/usr/bin/env python

import optparse

def main():
    server = "[fec1::1]:80"

    if server.find("[", 0, 2) == -1:
       print "IPv4"
       if server.find(":", 0, len(server)) == -1:
          ip = server
          port = ""
       else:
          ip, port = server.split(':')
    else:
       print "IPv6"
       index = server.find("]", 0, len(server))
       if index == -1:
          print "Something wrong"
          new_ip = ""
          port = ""
       else:
          if server.find(":", index, len(server)) == -1:
             new_ip = server
             port = ""
          else:
             new_ip, port = server.rsplit(':', 1)
       print new_ip
       ip = new_ip.strip('[]')

    print ip
    print port

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)