(ผมทราบดีว่านี่เป็นคำถามที่เก่า แต่ 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(หรือวิธีอื่น ๆ )
NOP0s :()