(Mi rendo conto che è una vecchia questione, ma Google mi ha portato qui perché stavo cercando di capire esattamente che cosa change
e replace
faccio e come sono diversi).
Credo che entrambi replace
e change
vengano utilizzati per modificare un indirizzo esistente. Ritenere:
ip addr add 192.168.1.10/32 dev dummy0
Questo mi fa:
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
Se eseguo nuovamente lo stesso comando, viene visualizzato un errore:
# ip addr add 192.168.111.10/32 dev dummy0
RTNETLINK answers: File exists
Se voglio modificare i flag su quell'indirizzo, posso usare change
o replace
. Qui, uso ip addr change
per modificare le impostazioni preferred_lft
e valid_lft
su quell'indirizzo:
# 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
Il comportamento di ip addr replace
è identico. In effetti, se guardi il codice, si traducono in azioni quasi identiche:
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);
Sembra che l'intenzione qui sia quella di change
modificare solo un indirizzo esistente, mentre replace
modificherà un indirizzo esistente o ne creerà uno nuovo se l'indirizzo specificato non esiste. In pratica, sembra che entrambi change
e replace
aggiungeranno l'indirizzo se non esiste già.
Se vuoi effettivamente aggiungere un nuovo indirizzo e rimuoverne uno vecchio, dovrai farlo in due passaggi, usando ip addr del
seguito da ip addr add
(o viceversa, ovviamente).
NO
P0
s :()