目前我有以下与eth0接口关联的 IPv4 地址:
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:~ #
Run Code Online (Sandbox Code Playgroud)
我想将 10.11.12.3/24 地址替换或更改为 10.11.12.6/24。这该怎么做?如果我执行ip addr change 10.11.12.6/24 dev eth0或ip addr replace 10.11.12.6/24 dev eth0然后 10.11.12.6 只是添加到 eth0。此外,在更改/替换的情况下,语法不应该是change/replace from 10.11.12.3/24 to 10.11.12.6/24? 我知道我可以使用ip addr del命令,但是如何使用ip addr change或来实现ip addr replace?
lar*_*sks 27
(我意识到这是一个老问题,但谷歌把我带到这里是因为我试图弄清楚它们到底是什么change和replace做什么以及它们有什么不同)。
我相信replace和change都用于修改现有地址。考虑:
ip addr add 192.168.1.10/32 dev dummy0
Run Code Online (Sandbox Code Playgroud)
这让我:
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
Run Code Online (Sandbox Code Playgroud)
如果我再次运行相同的命令,则会收到错误消息:
# ip addr add 192.168.111.10/32 dev dummy0
RTNETLINK answers: File exists
Run Code Online (Sandbox Code Playgroud)
如果我想修改该地址上的标志,我可以使用change或replace。在这里,我ip addr change用来修改该地址上的preferred_lft和valid_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
Run Code Online (Sandbox Code Playgroud)
的行为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);
Run Code Online (Sandbox Code Playgroud)
看起来这里的意图是change只会修改现有地址,而replace如果指定地址不存在,则会修改现有地址或创建新地址。在实践中,好像都change和replace如果它不存在将增加地址。
如果您确实想添加新地址并删除旧地址,则需要分两步完成,使用ip addr del后跟ip addr add(当然,或者反过来)。