วิธีรับที่อยู่ IP ของ IPv6 ใน Linux


35

ฉันมีเซิร์ฟเวอร์ Linux และฉันต้องการค้นหาที่อยู่ IPv6 หลักผ่านบรรทัดคำสั่งเดียว

คำสั่งของฉัน:

$ ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'

ซึ่งแสดงให้เห็น:

2001:410:0:39:221:28ff:fe46:eef4
fe80::221:28ff:fe46:eef4

แต่ฉันต้องการเหตุการณ์เดียวเท่านั้นดังนั้นผลลัพธ์ที่อ่านได้:

2001:410:0:39:221:28ff:fe46:eef4

เขียนเชลล์สคริปต์และใส่คำสั่งเหล่านั้น: voila ตอนนี้คุณได้สร้างคำสั่ง "เดี่ยว"
กิระ

4
เมื่อจัดการกับ IPv6 ไม่แนะนำให้ จำกัด ที่อยู่เดียว อาจมีที่อยู่ทั่วโลกหลายแห่งที่อยู่การเชื่อมโยงท้องถิ่นหลายแห่งที่อยู่ในท้องถิ่นหลายแห่ง ...
grawity

คำตอบ:


31
ip -6 addr

จะแสดงที่อยู่ IPv6 ของคุณ


% ip -6 addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 inet6 ::1/128 scope host valid_lft forever preferred_lft forever... ยังคง greppable
akira

1
นี่ไม่ได้แก้คำถามที่ระบุ OP ต้องการบรรทัดคำสั่งเดียวในการดึงหนึ่ง IPv6 (ซึ่งอาจหมายถึง Public หลัก) ดังนั้นip -6 addr show dev eth0 | sed -n 's|^.*inet6 \([^ ]*/64\).*$|\1|p'หรือip -6 addr show dev eth0 | awk '/inet6/{print $2}'อาจใช้เป็นฐานและ OP สามารถขยาย / แก้ไขสำหรับกรณีการใช้งานเฉพาะของเขา
rwenz3l

6

/sbin/ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^::1 | grep -v ^fe80

ผลลัพธ์ของ/sbin/ip -6 addr | grep inet6หน้าตาจะเป็นดังนี้:

inet6 ::1/128 scope host 
inet6 2001:123:456:55f::1/64 scope global 
inet6 fe80::62eb:69ff:fed2:d2a6/64 scope link 

awk -F '[ \t]+|/' '{print $3}'แยกตัวคั่นการตั้งค่าแต่ละบรรทัดให้เป็นช่องว่างสีขาวหนึ่งอันหรือมากกว่า ส่วนที่เราต้องการคือ $ 3

grep -v ^::1 | grep -v ^fe80จะไม่รวมสายใด ๆ ที่เริ่มต้นด้วยหรือ::1fe80


มีวิธีการส่ง grep ไปยัง awk มากเกินไปซึ่งอาจรวมกันเป็น awk เดียว 'awk -F' [\ t] + | / '' $ 3 == ":: 1" {next;} $ 3 ~ / ^ fe80 ::/ { ต่อไป ; } / inet6 / {พิมพ์ $ 3} ''
Archemar

3
$ /sbin/ifconfig | grep inet6
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link
      inet6 addr: fe80::211:22ff:fe33:4455/64 Scope:Link
      inet6 addr: ::1/128 Scope:Host

หากคุณต้องการสุ่มเลือกหนึ่งที่อยู่ IPv6

$ /sbin/ifconfig | grep inet6 | head -n 1
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link

หากคุณต้องการที่อยู่ IPv6 ของชื่อสามัญที่สุดสำหรับอะแดปเตอร์อีเธอร์เน็ตตัวแรก

$ /sbin/ifconfig eth0 | grep inet6
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link

หากคุณต้องการที่อยู่

$ /sbin/ifconfig eth0 |  awk '/inet6/{print $3}'
fe80::2ff:19ff:fe60:1a00/64

2

ใช้คำสั่งต่อไปนี้เพื่อดูที่อยู่ IP ของคุณบน Linux:

ifconfig

โดยปกติแล้วที่อยู่ Ipv6 ดูเหมือนว่า 2001:5c0:9168::/48รูปลักษณ์ที่อยู่ชอบ หากคุณกำลังเผชิญหน้ากับความขัดแย้งใด ๆ ใน IP ของคุณทำตามขั้นตอนด้านล่างเพื่อตั้งค่าที่อยู่ IP อีกครั้ง:

  1. ในการกำหนด IPv6 IP ให้ตรวจสอบว่าคุณได้ติดตั้งเครื่องมือ iproute2 แล้ว
  2. ใช้พวกเขามาเริ่มกำหนด IP ของคุณกันดีกว่า
  3. ตรวจสอบให้แน่ใจว่าติดตั้งโมดูล ipv6 หรือไม่

จากนั้นใช้คำสั่งต่อไปนี้เพื่อเพิ่ม ip ใหม่:

ip -f inet6 addr add 2001:5c0:9168::2/64 dev eth0

หลังจากนั้นให้เพิ่ม IP เริ่มต้นผ่านทาง

ip -f inet6 ro add default via 2001:5c0:9168::1 dev eth0

หลังจากเสร็จสิ้นการติดตั้งของคุณเพียงแค่กำหนดค่า / รีสตาร์ทบริการที่เปิดใช้งาน IPv6 ของคุณเช่น Apache, SSH เป็นต้น


ifconfigล้าสมัยบน Linux และไม่ควรใช้อีกต่อไป Linux distros ที่ทันสมัยไม่ได้ติดตั้งเป็นค่าเริ่มต้นอีกต่อไป (ยกเว้นบางแพ็คเกจที่ต้องใช้)
Michael Hampton

1

ด้วยการปรับแต่งเล็กน้อยความพยายามเริ่มต้นของคุณจะได้ผล:

ip -o -6 addr show eth0 | sed -e 's/^.*inet6 \([^ ]\+\).*/\1/'

การเปลี่ยนแปลงครั้งใหญ่ที่มีการเพิ่ม-oค่าสถานะเพื่อทำให้รายการถูกพิมพ์ออกมาหนึ่งรายการต่อบรรทัดซึ่งทำให้ง่ายต่อการเรียกใช้มากกว่าพวกเขา


0

ก่อนอื่นคุณต้องจำไว้ว่าด้วย IPv6 เครื่องใด ๆ อาจมีที่อยู่ IPv6 หลายแห่งและพวกเขาอาจอยู่ในเครือข่ายแยกต่างหากและอาจใช้ที่อยู่ใด ๆ ขึ้นอยู่กับว่าคุณต้องการเข้าถึงที่ใด

ดังนั้นก่อนที่คุณจะสามารถตอบคำถามว่าที่อยู่ IP ต้นทางของคุณคืออะไรคุณต้องตัดสินใจว่าจะส่งการรับส่งข้อมูลไปที่ใด จากนั้นคุณสามารถขอให้ Linux บอกคุณว่าที่อยู่ IPv6 ใดจะเป็นแหล่งที่มาเมื่อคุณส่งปริมาณข้อมูลไปยังปลายทางนั้น

หากคุณส่งไปที่ "อินเทอร์เน็ต" เพียงแค่เลือกที่อยู่ IPv6 ทั่วโลกโดยการสุ่มเช่นที่อยู่ DNS สาธารณะของ Google

ip r get to 2001:4860:4860::8888 | perl -ne '/src ([\w:]+)/ && print "$1\n"'
2001:db8:f387:c818:5:2:0:1000

นี่จะขอเส้นทางไปยังปลายทางนั้นจาก Linux Perl แจงผลการค้นหาsrcแล้วพิมพ์ฟิลด์ต่อไป

โดยการระบุปลายทางอื่นคุณอาจได้รับที่อยู่ต้นทางอื่น:

ip r get to ::1 | perl -ne '/src ([\w:]+)/ && print "$1\n"'
::1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.