按标签名称删除IP地址别名

按标签名称删除IP地址别名

我想删除我使用以下命令创建的别名:

ip addr add 192.168.1.1 dev eth0 label eth0:100

无需知道 IP 地址。基本上,我想做

ip addr del dev eth0 label eth0.100

其中,根据文档应该是有效的,但给了我:

ip: RTNETLINK answers: Operation not supported

与此同时,我尝试使用

ip addr del $(ip addr list label eth0:100 | awk '{ print $2 }') dev eth0 label eth0.100

答案1

您可以使用命令删除网络别名ifconfig

/sbin/ifconfig eth0:100 down

根据命令手册ip,删除IP地址只需要设备名称。其余参数是可选的。如果没有给出参数,第一个 IP 地址将从接口中删除。但实际上我无法重现这种行为。
看起来 IP 地址也是必需的。

您显示的最后一个命令之所以有效,是因为表达式ip addr list label eth0:100 | awk '{ print $2 }'给出了网络别名的 IP 地址并将该 IP 插入到ip addr delete ...命令中。

答案2

你所拥有的是最好的路线(虽然我会使用grepover awk,但这是个人喜好)。原因是每个“标签”可以有多个地址。因此,您必须指定要删除的地址。

# ip addr help
Usage: ip addr {add|change|replace} IFADDR dev STRING [ LIFETIME ]
                                                      [ CONFFLAG-LIST ]
       ip addr del IFADDR dev STRING
       ip addr {show|save|flush} [ dev STRING ] [ scope SCOPE-ID ]
                            [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ]
       ip addr {showdump|restore}
IFADDR := PREFIX | ADDR peer PREFIX
          [ broadcast ADDR ] [ anycast ADDR ]
          [ label STRING ] [ scope SCOPE-ID ]

请注意ip addr del参数为IFADDR和的语法STRINGIFADDR下面定义了,并且表示PREFIX是必需的参数(其中的内容[]是可选的)。PREFIX是您的 IP/子网组合。因此它不是可选的。


至于我关于使用的意思grep是这样的:

ip addr del $(ip addr show label eth0:100 | grep -oP 'inet \K\S+') dev eth0 label eth0:100

这样做的原因是为了防止参数的位置发生变化。输出中的字段位置ip addr可以根据可选字段进行更改。我不认为这个inet领域会改变,但这只是我的偏好。

答案3

ip命令具有-o生成适合解析的输出的标志。例如:

# ip -o addr show label wlp2s0:1|awk '{print $4}'
172.16.127.5/24

将其包装为命令替换就足够了$(...),我们有以下内容:

# ip addr del $(ip -o addr show label wlp2s0:1|awk '{print $4}') dev wlp2s0

同一主题的变体,但具有xargs

# ip -o a show label wlp2s0:1|awk '{print $4}'|xargs -I% ip a del % dev wlp2s0

请注意,您可以替换addra更短的命令

边注:

请注意,对于ip命令,这是 2011 手册页中所需的语法IP地址(8)

ip address del IFADDR dev IFNAME

因此,带有前缀的地址必须跟随del并且dev IFNAME是必需的。

相关内容