Tìm kiếm Blog này

Thứ Bảy, 18 tháng 3, 2017

Cách lấy IPv4/IPv6 (internal/external) trên shell/terminal/command line

source: https://www.if-not-true-then-false.com/2010/linux-get-ip-address/
Cái này khá tiện, dùng để lấy ip nội bộ lẫn công khai dễ dàng thay vì phải vào trình duyệt sau đó truy cập những web như thế này chả hạn https://www.whatismyip.com, hoặc phải ifconfig và lần mò trong rừng chữ. Chủ yếu nó dùng để các bác lấy ip này để làm kết quả đầu vào cho một chương trình shell, hoặc đoạn script của các bác, do kết quả trả về là dạng văn bản thuần túy (plain text)
dài dòng đủ rồi, bài viết bắt đầu.

Đây là bài hướng dẫn nhanh về cách lấy internal IP và external IP trên shell/command line (2 cái này còn được gọi là private IP và public IP, nó là cái gì thì đọc ở blog này nhé link )
Ghi chú: những lệnh dưới đây khá là dài dòng, các bác có thể biến nó thành hàm (function), đặt cho nó cái tên dễ nhớ, rồi khi cần cứ gọi nó ra cho dễ. cách làm thì đây (link). Ngoài ra,do phải trích xuất từ kết quả của câu lệnh, nên phải sử dụng lệnh awk rất nhiều, lệnh awk cũng sẽ hoạt động giống gawk và nawk.

1. Lấy Internal IP trên shell/command line

1.1 lấy IP và IPv6 theo interface được chỉ định.

có cần giải thích interface là gì không ? Sau này quên thì chắc em vẫn nhớ nó là gì thôi, vậy nên không giải thích.
câu lệnh:
/sbin/ifconfig $1 | grep "inet\|inet6" | awk -F' ' '{print $2}' | awk '{print $1}'
$1 là tên của interface, kết quả trả về sẽ có dạng
dòng 1: IPv4
dòng 2: IPv6
kết quả sẽ có 2 dòng, nếu interface nào không có ipv6 thì 1 dòng.
VD:
/sbin/ifconfig eth0 | grep "inet\|inet6" | awk -F' ' '{print $2}' | awk '{print $1}'
10.20.10.1
0:0:0:0:0:ffff:a14:a01
Tạo một cái hàm với tên int-ip và add nó vào ~/.bashrc hoặc /etc/bashrc, để dễ dàng sửa dụng sau này:
function int-ip { /sbin/ifconfig $1 | grep "inet\|inet6" | awk -F' ' '{print $2}' | awk '{print $1}'; }
sau này cần thì
int-ip
Ví dụ:

int-ip eth0
10.20.10.1
0:0:0:0:0:ffff:a14:a01

1.2 Lấy tất cả ipv4 lẫn v6 của tất cả các interface

lần này sẽ lấy toàn bộ.
/sbin/ifconfig |grep -B1 "inet\|inet6" |awk '{ if ( $1 == "inet" || $1 == "inet6" ) { print " ",$2 } else if ( $1 != "inet" && $1 != "inet6" ) { print $1 } }'
Ví dụ một kết quả:
lo:
127.0.0.1
::1
--
eth0:
192.168.1.11
fe80::3a2c:4aff:fe48:2a55
kết quả trả về sẽ được phân cách bằng dấu -- giữa các interface, và chúng ta cũng sẽ biến nó thành cái hàm với tên bất kì (VD:int-ips)
function int-ips { /sbin/ifconfig |grep -B1 "inet\|inet6" |awk '{ if ( $1 == "inet" || $1 == "inet6" ) { print " ",$2 } else if ( $1 != "inet" && $1 != "inet6" ) { print $1 } }'; }
VD:
int-ips
lo:
127.0.0.1
::1
--
eth0:
192.168.1.11
fe80::3a2c:4aff:fe48:2a55
Xong phần internal IP

2. Lấy External IP trên shell/command line:

Ở đây chúng ta sẽ sử dụng dịch vụ của ipecho.net, hay ở chỗ thằng này có phần gửi trả kết quả dạng plain text. Dưới đây sẽ hướng dẫn cách dùng 2 ứng dụng Lynx và Curl để lấy cái kết quả này.

2.1 lấy External IP bằng Lynx

lynx --dump http://ipecho.net/plain
để ngắn gọn, ta cũng tạo 1 cái hàm với tên ext-ip
function ext-ip () { lynx --dump http://ipecho.net/plain; }
VD:
ip## Example usage ##
ext-ip
80.10.10.80

2.2 lấy External IP bằng Curl

curl http://ipecho.net/plain; echo
và ta cũng tạo 1 cái hàm
function ext-ip () { curl http://ipecho.net/plain; echo; }
VD:
ext-ip
80.10.10.80
Hết.

Không có nhận xét nào:

Đăng nhận xét