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 ifconfig
khá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 ifconfig
khô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'
ifconfig
là 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 iproute2
sử dụng cơ chế ổ cắm mạng song công hoàn toàn đó, trong khi ifconfig
dựa vào cuộc gọi hệ thống ioctl.