it-swarm-vi.tech

Phân tích ifconfig để chỉ nhận địa chỉ IP của tôi bằng Bash

Tôi muốn chỉnh sửa tệp bashrc để có một chức năng đơn giản gọi là "myip" để chạy. Như bạn có thể đoán, chức năng myip chỉ in địa chỉ IP nội bộ của máy tôi.

Theo như tôi đã làm việc, đây là kịch bản:

ifconfig en1 | awk '{ print $2}' | sort

Mà có đầu ra này của tôi:

10.0.0.12
options=1<PERFORMNUD>
flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST>
fe80::daa2:5eff:fe96:ba2f%en1
d8:a2:5e:96:ba:2f
autoselect
active

Tôi đang làm việc trên Mac OS X.

Làm thế nào tôi có thể làm điều này được thực hiện?

14
Fernando Retimo

Chà, sau nhiều giờ vật lộn cuối cùng tôi đã hiểu đúng:

ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

Phần cuối cùng tôi đã thiếu chỉ là một mẫu địa chỉ IP từ danh sách của tôi.

8
Fernando Retimo

Cả hai công việc sau đây (CentOS 5).

ip addr show eth0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'

ifconfig eth0 | awk '/inet addr/ {gsub("addr:", "", $2); print $2}'

Đối với OS X ( v10.11 (El Capitan) ít nhất):

ifconfig en0 | awk '$1 == "inet" {print $2}'
22
Etan Reisner

Đây là cách nhiều hơn "bất khả tri" để lấy địa chỉ IP, bất kể hệ thống * nix của bạn (Mac OS, Linux), tên giao diện và thậm chí cả cấu hình ngôn ngữ của bạn:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d:

Nếu bạn có nhiều IP hoạt động, sẽ liệt kê từng IP trong một dòng riêng biệt. Nếu bạn chỉ muốn IP đầu tiên, hãy thêm | head -n1 vào biểu thức:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" \
     | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1

Và nếu bạn muốn địa chỉ IP của một giao diện cụ thể, hãy thay thế biểu thức đầu tiên ifconfig bằng ifconfig INTERFACENAME, ví dụ ifconfig eth0 | grep -E ....

Đây là một số ví dụ được đề cập trong trang này bị lỗi trong một số trường hợp và tại sao:

  • ip route ...: lệnh ip không được cài đặt trong các máy OSX.
  • hostname -I: tùy chọn -I không hợp lệ trong OSX.
  • ifconfig en0 ...: tên giao diện (eth0, en0) khác nhau trong Linux và OSX, và trong Linux, tên cũng phụ thuộc vào loại giao diện (ethX cho kết nối ethernet, wlanX cho không dây, v.v.).
  • python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))': điều này đã cho tôi 127.0.1.1 (một loopback IP) trong Ubuntu Linux 14.04, vì vậy không hoạt động.
  • ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' ': Bài đăng của Geograph gần hơn, nhưng không hoạt động trong một số bản phân phối Linux mà không có LANG=en được định cấu hình, bởi vì văn bản inet addr:grep tìm kiếm là một văn bản khác ở các ngôn ngữ khác .
14
Mariano Ruiz

Trong trường hợp eth0, các công việc sau đây cho tôi. Cố gắng tinh chỉnh nó với logic tương tự.

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'  
12
JSR

Bạn có thể sử dụng awk để thực hiện cả việc chọn dòng inet và phân tích địa chỉ IP như vậy:

$ ip addr ls docker0 | awk '/inet / {print $2}' | cut -d"/" -f1
172.17.42.1

Trong ví dụ trên, thay thế thiết bị xử lý eth0 trong cho docker0. Ngoài ra, nếu bạn muốn triển khai AWK thuần túy, bạn có thể thực hiện "cắt" trong như vậy:

$ ip addr ls docker0 | awk '/inet / {split($2, ary, /\//); print ary[1]}'
172.17.42.1
7
slm

Có một cách dễ dàng khác để lấy địa chỉ IP ngoài việc phân tích cú pháp ifconfig.

hostname -I -I, --all-ip-addresses all addresses for the Host -i, --ip-address addresses for the hostname

Tham chiếu: http://linux.die.net/man/1/hostname

Thí dụ:

[ec2-user @ terraform ~] $ tên máy chủ -I
10.10.10.10

3
Baskar

Ví dụ IPv4 sử dụng BASH4 +

Ví dụ 1 , sử dụng tên máy chủ:

  hostname -I|cut -d" " -f 1

Ví dụ 2, thiết bị được biết (và nó không bao giờ thay đổi):

  ifconfig ens5 | grep "inet" | awk '{print $2}' |  sed 's/[^0-9.]*//g'

Ví dụ 3 , bây giờ không phải thiết bị (ví dụ: eth0, eth1, enp0s23 hoặc wpxxx):

 ip a | awk 'BEGIN{ "hostname -I|cut -d\" \" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF "  IP: "$2}'

Ví dụ 4 , muốn địa chỉ IP mạng:

 wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1

thưởng thức.

3
Mike Q

Không cần phải phân tích cú pháp ifconfig không thể truy cập trong Bash. Đó là một lớp lót tầm thường trong Python:

python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
2
John Zwinck

Nếu bạn đang tìm kiếm chỉ "inet" chứ không phải "inet6", thì điều này hiệu quả với tôi:

/usr/bin/ifconfig eth0 | grep --Word-regexp inet | awk '{print $2}'

. .

1
Jonathan Le

Bạn cũng có thể thử điều này

[email protected]:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk '{ print $1}'
[email protected]:~$ 

Đầu ra

[email protected]:~$ ./script.sh
192.168.1.1
10.0.1.1
[email protected]:~$

Xin lưu ý rằng đầu ra ifconfig có thể khác nhau tùy thuộc vào phiên bản linux của bạn. Do đó, bạn có thể muốn thay đổi tập lệnh cho phù hợp.

Btw, đây là đầu ra ifconfig của tôi

[email protected]:~$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:00:00:00:00:10  
          inet addr:192.168.1.1  Bcast:192.168.56.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:112 errors:0 dropped:0 overruns:0 frame:0
          TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:14616 (14.2 KiB)  TX bytes:17776 (17.3 KiB)

eth1      Link encap:Ethernet  HWaddr 00:00:00:00:00:11
          inet addr:10.0.1.1  Bcast:10.0.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[email protected]:~$
1
Charlotte Russell

Điều này làm việc cho tôi:
[.__.] ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

0
user3396065

Sử dụng:

ifconfig enops3 | greb broadcast | cut -d " " -f10

Trong đó enops3 là tên giao diện.

0
Khalid Abdlqader

Mã này xuất địa chỉ IP cho tất cả các kết nối mạng (ngoại trừ loopback) và di động giữa most phiên bản OS X và Linux .

Nó đặc biệt hữu ích cho các tập lệnh chạy trên các máy trong đó:

  • Bộ điều hợp mạng hoạt động không xác định,
  • máy tính xách tay chuyển đổi giữa các kết nối Wi-Fi và Ethernet và
  • máy có nhiều kết nối mạng.

Kịch bản là:

/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2

Điều này có thể được gán cho một biến trong một kịch bản như thế này:

myip=$(/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2)

Các tập lệnh có thể xử lý nhiều địa chỉ có thể bằng cách sử dụng một vòng lặp để xử lý kết quả, như vậy:

if [[ -n $myip ]]; then
  count=0
  for i in $myip; do
    myips[count]=$i       # Or process as desired
    ((++count))
  done
  numIPaddresses=$count   # Optional parameter, if wanted
fi

Ghi chú:

  • Nó lọc 'ifconfig' trên "cast", vì điều này có thêm hiệu ứng lọc các địa chỉ loopback trong khi cũng hoạt động trên hầu hết các phiên bản OS X và Linux.
  • Chức năng 'cắt' cuối cùng là cần thiết cho chức năng phù hợp trên Linux, nhưng không phải là OS X. Tuy nhiên, nó không ảnh hưởng đến kết quả của OS X - vì vậy nó còn để lại tính di động.
0
azrobbo

Tương tự như JSR, nhưng với awkcut theo thứ tự ngược lại:

my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}
0
Arun

Mã cũng hoạt động trên VDS/VPS:

ifconfig | grep -A2 "venet0:0\|eth0" | grep 'inet addr:' | sed -r 's/.*inet addr:([^ ]+).*/\1/' | head -1

hoặc là

ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
0
Geograph

Sau khi thử một số giải pháp tôi thấy điều này tiện dụng nhất, Thêm điều này vào bí danh của bạn:

alias iconfig='ifconfig | awk '\''{if ( $1 >= "en" && $2 >= "flags" && $3 == "mtu") {print $1}; if ( $1 == "inet" || $1 == "status:"){print $0};}'\''|egrep "en|lo|inet"'

đầu ra trông như thế này:

[email protected]o:xxxx/xxx ‹dev*›$ iconfig lo0: inet 127.0.0.1 netmask 0xff000000 en0: inet 10.16.27.115 netmask 0xffffff00 broadcast 10.16.27.255 en1: en2: en5: inet 192.168.2.196 netmask 0xffffff00 broadcast 192.168.2.255 

0
Shadycorp

Lấy patch's trả lời, làm cho nó tổng quát hơn một chút,

tức là: bỏ qua mọi thứ cho đến chữ số đầu tiên.

ifconfig eth0 | awk '/inet addr/{sub(/[^0-9]*/,""); print $1}'

Hoặc thậm chí tốt hơn:

ifconfig eth0 | awk '/inet /{sub(/[^0-9]*/,""); print $1}'

  • Vui lòng lưu ý phần in ở cuối - thay đổi từ $ 2 thành $ 1.

Sử dụng Perl Regex:

ifconfig eth0 | grep -oP '(?<= inet addr:)[^ ]+'

Giải thích: grep -oP tìm kiếm một trận đấu CHÍNH XÁC bằng cách sử dụng biểu thức chính quy Perl.
[.__.] Phần "khó khăn" là chính regex;
[.__.] 1. (?<= inet addr:) có nghĩa là - chuỗi inet addr: là TRÁI PHIẾU của những gì chúng tôi đang tìm kiếm.
[.__.] 2. [^ ]+ (vui lòng chú ý khoảng trắng sau ^) - có nghĩa là tìm kiếm mọi thứ cho đến khi trống đầu tiên - trong trường hợp của chúng tôi đó là Địa chỉ IP.

0
AK75