0

我必须用 bash 、 perl 或 python 编写脚本。我得到了包含三列的文件(用于手动管理连接代理)

SUBNET/IP         socks_port        socks_ip 
1.2.3.*              1080             9.8.7.6
1.1.*                1080             6.8.7.6

我想知道IP地址属于哪个子网,例如:

$ my_script  1.1.1.2

这个 IP 属于1.1.*子网,所以我想要返回第二行。

4

2 回答 2

1

BASH:又快又脏,使用cut,然后grep在文件上。

PYTHON:使用ip.rsplit()然后line.split()[].startswith()遍历文件。

PERL:不知道。

干杯!

于 2011-03-30T13:44:15.983 回答
0

如果文件采用给定的格式(即使用 *),则使用 bash 模式匹配将其与 ip 地址进行比较会相当容易。但是,正如@Mark Drago 指出的那样,这种格式除了八位组边界子网之外的任何内容,因此如果您需要支持任意子网边界,则需要更好的格式。

假设您使用的是“1.2.*”格式,这应该可以工作:

#!/bin/bash
ip="$1"
found_match=false
while read subnet socks_port socks_ip; do
    if [[ "$ip" == $subnet ]]; then  # this'll do glob-style pattern matching against $subnet
        echo "subnet=$subnet, socks_port=$socks_port, socks_ip=$socks_port"
        found_match=true
        break  # assuming you don't want to check for multiple matches
    fi
done </path/to/subnet/file

if ! $found_match; then
    echo "No match found in subnet file"
fi
于 2011-03-30T17:52:18.187 回答