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.