(Я понимаю, что это старый вопрос, но Google привел меня сюда, потому что я пытался выяснить, что именно change
и replace
чем они отличаются и чем они отличаются).
Я считаю, что оба replace
и change
используются для изменения существующего адреса. Рассматривать:
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
Если я хочу изменить флаги на этом адресе, я могу использовать либо 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
Поведение 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
либо изменить существующий адрес, либо создать новый, если указанный адрес не существует. На практике кажется, что оба change
и replace
добавят адрес, если он еще не существует.
Если вы действительно хотите добавить новый адрес и удалить старый, вам нужно будет сделать это в два шага, используя, ip addr del
а затем ip addr add
(или наоборот, конечно).
NO
P0
s :()