(Zdaję sobie sprawę, że jest to stare pytanie, ale Google przyniósł mi tutaj bo próbuje dowiedzieć się dokładnie, co change
i replace
robić i jak są one różne).
Uważam, że zarówno replace
i change
są wykorzystywane do modyfikacji istniejącego adresu. Rozważać:
ip addr add 192.168.1.10/32 dev dummy0
To daje mi:
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
Jeśli ponownie uruchomię to samo polecenie, pojawia się błąd:
# ip addr add 192.168.111.10/32 dev dummy0
RTNETLINK answers: File exists
Jeśli chcę, aby zmodyfikować flagi na ten adres, mogę użyć jednej change
lub replace
. Tutaj używam ip addr change
do modyfikowania preferred_lft
i valid_lft
ustawień tego adresu:
# 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
Zachowanie ip addr replace
jest identyczne. W rzeczywistości, jeśli spojrzysz na kod, skutkują prawie identycznymi działaniami:
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);
Wygląda na to, że intencją jest to, że change
zmodyfikuje tylko istniejący adres, replace
albo albo zmodyfikuje istniejący adres, albo utworzy nowy, jeśli podany adres nie istnieje. W praktyce wydaje się, że jedno change
i drugie replace
doda adres, jeśli jeszcze nie istnieje.
Jeśli rzeczywiście chcesz dodać nowy adres i usunąć starą, trzeba to zrobić w dwóch etapach, korzystając ip addr del
następnie ip addr add
(lub na odwrót, oczywiście).
NO
P0
s :()