了解“ip addr change”和“ip addr replace”命令

目前,我有以下IPv4地址与eth0接口关联:

T60:~ # ip -V ip utility, iproute2-ss110629 T60:~ # ip addr show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:15:58:2a:84:3e brd ff:ff:ff:ff:ff:ff inet 10.11.12.2/24 scope global eth0 inet 10.11.12.3/24 scope global secondary eth0 inet 10.11.12.4/24 scope global secondary eth0 inet6 fe80::215:58ff:fe2a:843e/64 scope link valid_lft forever preferred_lft forever T60:~ # 

我想将10.11.12.3/24地址更换或更改为10.11.12.6/24。 这个怎么做? 如果我执行ip addr change 10.11.12.6/24 dev eth0ip addr replace 10.11.12.6/24 dev eth0则10.11.12.6刚添加到eth0。 另外,在更改/replace的情况下,语法是否应该change/replace from 10.11.12.3/24 to 10.11.12.6/24 ? 我知道我可以使用ip addr del命令,但是如何用ip addr changeip addr replace来实现这个ip addr replace

(我意识到这是一个古老的问题,但谷歌把我带到这里,因为我试图找出什么样的changereplace ,以及他们是如何不同)。

我相信, replacechange都用于修改现有的地址。 考虑:

 ip addr add 192.168.1.10/32 dev dummy0 

这让我:

 32: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether 5a:ec:58:4f:d1:35 brd ff:ff:ff:ff:ff:ff inet 192.168.111.10/32 scope global dummy0 valid_lft forever preferred_lft forever inet6 fe80::58ec:58ff:fe4f:d135/64 scope link valid_lft forever preferred_lft forever 

如果我再次运行相同的命令,我得到一个错误:

 # ip addr add 192.168.111.10/32 dev dummy0 RTNETLINK answers: File exists 

如果我想修改该地址上的标志,我可以使用changereplace 。 在这里,我使用ip addr change来修改该ip addr changepreferred_lftvalid_lft设置:

 # ip addr change 192.168.111.10/32 dev dummy0 preferred_lft 300 valid_lft 300 # ip addr show dummy0 32: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether 5a:ec:58:4f:d1:35 brd ff:ff:ff:ff:ff:ff inet 192.168.111.10/32 scope global dynamic dummy0 valid_lft 298sec preferred_lft 298sec inet6 fe80::58ec:58ff:fe4f:d135/64 scope link valid_lft forever preferred_lft forever 

ip addr replace的行为是相同的。 事实上,如果您查看代码,则会导致几乎相同的操作:

  if (matches(*argv, "change") == 0 || strcmp(*argv, "chg") == 0) return ipaddr_modify(RTM_NEWADDR, NLM_F_REPLACE, argc-1, argv+1); if (matches(*argv, "replace") == 0) return ipaddr_modify(RTM_NEWADDR, NLM_F_CREATE|NLM_F_REPLACE, argc-1, argv+1); 

看起来这里的意图是change将只修改现有的地址,而replace将修改现有的地址,或者如果指定的地址不存在,则创build新的地址。 在实践中,似乎如果changereplace地址,如果它不存在,将添加地址。

如果你真的想添加一个新的地址并删除一个旧地址,你需要分两步进行,使用ip addr delip addr add (当然也可以使用其他方法)。