ทำความเข้าใจกับคำสั่ง "ip addr change" และ "ip addr replace"


10

ในขณะนี้ฉันมีที่อยู่ IPv4 ต่อไปนี้ซึ่งเชื่อมโยงกับส่วนต่อประสานeth0 :

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:~ # 

ฉันต้องการแทนที่หรือเปลี่ยนแปลงที่อยู่ 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?

คำตอบ:


19

(ผมทราบดีว่านี่เป็นคำถามที่เก่า แต่ 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 P0s :()
Samveen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.