Cách lấy địa chỉ IP IPv6 trong Linux


35

Tôi có một máy chủ Linux và tôi muốn tìm địa chỉ IPv6 chính thông qua một dòng lệnh duy nhất.

Lệnh của tôi cho đến nay:

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

cho thấy:

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

Nhưng tôi chỉ muốn một lần xuất hiện , để đầu ra đọc:

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

viết một kịch bản shell và đặt các lệnh đó vào đó: voila, giờ bạn đã tạo một lệnh "đơn".
akira

4
Khi giao dịch với IPv6, không thực sự nên giới hạn ở một địa chỉ duy nhất. Có thể có nhiều địa chỉ toàn cầu, nhiều địa chỉ liên kết cục bộ, nhiều địa chỉ trang web địa phương ...
grawity

Câu trả lời:


31
ip -6 addr

sẽ hiển thị địa chỉ IPv6 của bạn.


% ip -6 addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 inet6 ::1/128 scope host valid_lft forever preferred_lft forever... vẫn có thể tham gia
akira

1
Điều này không giải quyết được câu hỏi đã nêu. OP muốn một dòng lệnh duy nhất để truy xuất một IPv6 (có thể có nghĩa là một công khai chính). Vì vậy, ip -6 addr show dev eth0 | sed -n 's|^.*inet6 \([^ ]*/64\).*$|\1|p'hoặc ip -6 addr show dev eth0 | awk '/inet6/{print $2}'có thể được sử dụng làm cơ sở và OP có thể mở rộng / chỉnh sửa chúng cho trường hợp sử dụng cụ thể của mình.
rwenz3l

6

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

Đầu ra /sbin/ip -6 addr | grep inet6trông giống như thế này:

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}'chia tách từng dấu phân cách cài đặt dòng thành một hoặc nhiều khoảng trắng hoặc dấu gạch chéo về phía trước. Phần chúng ta cần là $ 3.

grep -v ^::1 | grep -v ^fe80để loại trừ bất kỳ dòng bắt đầu bằng ::1hoặc fe80.


có quá nhiều đường ống grep vào awk, đây có thể là collaspe thành một awk duy nhất `awk -F '[\ t] + | /' '$ 3 ==" :: 1 "{next;} $ 3 ~ / ^ fe80 ::/ { kế tiếp ; } / inet6 / {in $ 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

Nếu bạn muốn lựa chọn ngẫu nhiên một địa chỉ IPv6

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

Nếu bạn muốn địa chỉ IPv6 của tên phổ biến nhất cho bộ điều hợp Ethernet đầu tiên

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

Nếu bạn chỉ muốn địa chỉ

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

2

Sử dụng lệnh sau để xem địa chỉ IP của bạn trên Linux:

ifconfig

Thông thường, địa chỉ Ipv6 trông như thế 2001:5c0:9168::/48. Nếu bạn đang phải đối mặt với bất kỳ xung đột nào trong IP của mình, hãy làm theo các bước dưới đây để đặt lại địa chỉ IP:

  1. Để gán IP IPv6, hãy đảm bảo bạn đã cài đặt các công cụ iproute2.
  2. Sử dụng chúng, hãy bắt đầu gán IP của bạn.
  3. Hãy chắc chắn rằng mô-đun ipv6 được cài đặt hay không.

Sau đó, sử dụng lệnh sau để thêm ip mới:

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

Sau đó, thêm ip mặc định qua

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

Sau khi hoàn tất cài đặt của bạn, chỉ cần cấu hình lại / khởi động lại các dịch vụ hỗ trợ IPv6 của bạn, như Apache, SSH, v.v.


ifconfigđã lỗi thời trên Linux và không còn được sử dụng. Các bản phân phối Linux hiện đại thậm chí không cài đặt nó theo mặc định nữa (trừ khi một số gói cũ yêu cầu nó).
Michael Hampton

1

Với một vài điều chỉnh nhỏ, nỗ lực ban đầu của bạn sẽ có hiệu quả:

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

Sự thay đổi lớn là việc bổ sung -ocờ để làm cho các mục được in ra, mỗi mục trên một dòng, giúp cho việc chạy sed qua chúng dễ dàng hơn.


0

Trước tiên, bạn cần nhớ rằng với IPv6, bất kỳ máy nào cũng có thể có một vài địa chỉ IPv6 và chúng có thể nằm trên các mạng riêng biệt và bất kỳ mạng nào trong số chúng có thể được sử dụng, tùy thuộc vào nơi bạn muốn tiếp cận.

Vì vậy, trước khi bạn có thể trả lời câu hỏi địa chỉ IP nguồn của bạn là gì, bạn phải quyết định nơi bạn gửi lưu lượng. Sau đó, bạn có thể yêu cầu Linux cho bạn biết địa chỉ IPv6 nào sẽ là nguồn khi bạn gửi lưu lượng đến đích đó.

Nếu bạn đang gửi nó tới "Internet" thì chỉ cần chọn một địa chỉ IPv6 toàn cầu một cách ngẫu nhiên, ví dụ: địa chỉ DNS công cộng của Google.

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

Điều này yêu cầu Linux cho tuyến đường đến đích đó. Perl phân tích kết quả tìm kiếm srcvà sau đó in trường tiếp theo.

Bằng cách cung cấp một điểm đến khác, bạn có thể nhận được một địa chỉ nguồn khác:

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

0
ip addr show dev eth0 | sed -e's/^.*inet6 \(2001[^ ]*\)\/64 scope global dynamic.*$/\1/;t;d'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.