Làm cách nào để chụp địa chỉ IP đầu tiên từ lệnh ifconfig?


9

Làm thế nào để nắm bắt địa chỉ IP đầu tiên xuất phát từ ifconfiglệnh?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Kết quả dự kiến:

IP=100.14.22.12

3
Câu hỏi đã được trả lời, bằng cách sử dụng awk hoặc grep / cut, v.v. Nhưng nói chung vẫn là một ý tưởng tồi để sử dụng và grep từ ifconfig. ip phù hợp hơn và được hỗ trợ tốt hơn trong các bản dựng Linux hiện đại.
Pedro

1
Điều này nghe có vẻ như là một vấn đề XY. Bạn thực sự muốn thông tin gì? Địa chỉ IP đối diện mạng chính của máy? Bất kỳ địa chỉ IP đối diện mạng của máy? Địa chỉ IP của bộ điều hợp mạng đầu tiên? Bất kỳ địa chỉ IP, không quan trọng nó là gì? Có lẽ có một cách trực tiếp, chính xác và di động hơn để có được thông tin bạn cần.
alex.forencich

Câu trả lời:


20

Tốt hơn hết là tránh sử dụng ifconfigđể lấy địa chỉ IP trong tập lệnh, nó không được dùng trong một số bản phân phối (ví dụ: CentOS và các bản khác, không cài đặt nó theo mặc định nữa).

Trong các hệ thống khác, đầu ra của ifconfig thay đổi tùy theo bản phát hành phân phối (ví dụ: đầu ra / khoảng cách / các trường ifconfigkhác nhau từ Debian 8 đến Debian 9 chẳng hạn).

Để nhận địa chỉ IP ip, theo cách tương tự bạn đang hỏi:

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

Hoặc tốt hơn:

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

Hoặc, khi bạn hỏi "IP ="

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

Thích nghi không biết xấu hổ từ ý tưởng từ @Roman

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

Đầu ra bình thường:

 $ ip -o -4  address show 
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\       valid_lft forever preferred_lft forever

Từ man ip:

-o, -oneline
xuất từng bản ghi trên một dòng, thay thế nguồn cấp dữ liệu bằng ký tự '\'. Điều này thuận tiện khi bạn muốn đếm các bản ghi với wc (1) hoặc grep (1) đầu ra.

Xem một ví dụ về lý do tại sao ifconfigkhông được khuyên: BBB: `bbb-conf --check` hiển thị địa chỉ IP là` inet` - ifconfig woes

Để hiểu lý do tại sao ifconfigđang trên đường ra, hãy xem Sự khác biệt giữa các lệnh 'ifconfig' và 'ip'

ifconfiglà từ các công cụ mạng, vốn không thể theo kịp với ngăn xếp mạng Linux trong một thời gian dài. Nó cũng vẫn sử dụng ioctl cho cấu hình mạng, đây là một cách tương tác xấu xí và kém mạnh mẽ hơn với kernel.

Khoảng năm 2005, một cơ chế mới để kiểm soát ngăn xếp mạng đã được giới thiệu - ổ cắm netlink.

Để cấu hình giao diện mạng, hãy iproute2sử dụng cơ chế ổ cắm mạng song công hoàn toàn đó, trong khi ifconfigdựa vào cuộc gọi hệ thống ioctl.


Tôi không muốn đặt eth0 làm mặc định vì tên này thay đổi trên máy, chúng tôi có thể cung cấp cú pháp linh hoạt không
yael

@yael Thay đổi, lấy ra eth0. Tuy nhiên, Roman đã làm tốt hơn tôi khi in "IP =" bên trong awk. Quá nhiều trí tuệ cho tôi, vẫn thức dậy. Tránh ifconfig, nó không có tương lai và vị trí của địa chỉ IP thay đổi, có ít nhất hai phiên bản / triển khai khác nhau (?) Cho Linux mà tôi biết.
Rui F Ribeiro

Chỉ cần thông tin, trên các phiên bản mới hơn của iproute2 (ví dụ: không phải trên CentOS7 hay Debian8), ip có thể lấy -brieftham số và đầu ra của nó trở nên dễ dàng hơn để phân tích (2015-08-31: git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/ trộm )
AB

@AB cũng -o khi tôi sử dụng giúp, cảm ơn, sẽ kiểm tra xem ou
Rui F Ribeiro

1
À, tôi không biết -ocái nào thực sự có ích cho kịch bản
AB

6

Awk giải pháp:

ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'

Đầu ra mẫu:

IP=10.0.2.15

-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}

1
xem điều này:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro

1
Tại sao bạn lại grepping cho localhost IP 127.0.0.1?
Jeff Schaller
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.