2010-07-11 25 views

Trả lời

9

Xem chức năng INET_NTOA, bạn có thể sử dụng để chuyển số thành IP trên máy chủ MySQL.

+0

Cảm ơn! Đã không nhận ra bạn thực sự có thể vượt qua trường mysql để INET_NTOA. – Mark

1

Giả sử bạn có một trường gọi là ip_addr trong một bảng gọi là hosts

Sau đó

select INET_NTOA(ip_addr) from hosts; 

sẽ làm các truy vấn và trả về IP quad rải rác trong tập kết quả.

15

Kể từ khi bạn yêu cầu Bash:

INET_NTOA() { 
    local IFS=. num quad ip e 
    num=$1 
    for e in 3 2 1 
    do 
     ((quad = 256 ** e)) 
     ((ip[3-e] = num/quad)) 
     ((num = num % quad)) 
    done 
    ip[3]=$num 
    echo "${ip[*]}" 
} 

INET_ATON() 
{ 
    local IFS=. ip num e 
    ip=($1) 
    for e in 3 2 1 
    do 
     ((num += ip[3-e] * 256 ** e)) 
    done 
    ((num += ip[3])) 
    echo "$num" 
} 

Ví dụ:

$ INET_ATON 10.2.1.255 
167903743 
$ INET_NTOA 167903743 
10.2.1.255 

Đây là một phiên bản đó sẽ làm việc trong bất kỳ vỏ Bourne có nguồn gốc từ Tôi đã cố gắng bao gồm dấu gạch ngang, ksh, một số phiên bản của Bash, BusyBox ash, zsh (với -y) và thậm chí là Heirloom Bourne Shell.

INET_NTOA() { 
    num=$1 
    ip= 
    for e in 3 2 1 
    do 
     quad=`echo "256^$e" | bc` 
     if [ -n "$ip" ] 
     then 
      ip=$ip. 
     fi 
     ip=$ip`echo "$num/$quad" | bc` 
     num=`echo "$num % $quad" | bc` 
    done 
    ip=$ip.$num 
    echo "$ip" 
} 

INET_ATON() 
{ 
    num=0 
    e=3 
    saveIFS=$IFS 
    IFS=. 
    set -- $1 
    IFS=$saveIFS 
    for ip in "[email protected]" 
    do 
     num=`echo "$num + $ip * 256^$e" | bc` 
     e=`echo "$e - 1" | bc` 
    done 
    echo "$num" 
} 
+1

+1, cảm ơn các chức năng này! Nếu bạn cố gắng làm mặt nạ với số nguyên lớn, bạn có thể gặp sự cố liên quan. Áp dụng giải pháp thay thế trong [câu trả lời này] (http://stackoverflow.com/questions/210629/python-unsigned-32-bit-bitwise-arithmetic) sẽ khắc phục sự cố đó. Ví dụ. 'INET_NTOA $ ((($ (INET_ATON 192.168.1.12) | ~ $ (INET_ATON 255.255.255.0))))' lợi nhuận '-63.-87.-254.-1', nhưng' INET_NTOA $ ((($ (INET_ATON 192.168.1.12) | ~ $ (INET_ATON 255.255.255.0)) & 0xFFFFFFFF)) 'sản lượng' 192.168.1.255' là những gì bạn muốn. – bstpierre

+0

Khi tôi cố gắng chạy trong shell nó không hoạt động, nó có vấn đề với các dòng sau: 'echo '$ {ip [*]}" 'và' ip = ($ 1) ' – ArmenB

+0

@Armen: Shell nào bạn sử dụng và loại vấn đề gì? Vui lòng đăng một thông báo lỗi cụ thể. Có thể bạn đang sử dụng một trình bao không hỗ trợ mảng hoặc sử dụng cú pháp khác. –

3
 
INET_ATON() 
    { 
    local IFS=. ipStr 

    ipStr=($1) 
    echo $(($(($(($(($(($((${ipStr[0]} * 256)) + ${ipStr[1]})) * 256)) + ${ipStr[2]})) * 256)) + ${ipStr[3]})) 
    } 

INET_NTOA() 
    { 
    echo "$(($1/16777216)).$(($(($1 % 16777216))/65536)).$(($(($1 % 65536))/256)).$(($1 % 256))" 
    } 

subnetRange() 
    { 
    local addr=$(INET_ATON "$1") mask=$(INET_ATON "$2") 

    echo "$(INET_NTOA $(($addr & $mask))) $(INET_NTOA $(($addr | $mask^4294967295)))" 
    } 


+2

Không cần thiết cho tất cả các lồng nhau thêm '$ (())'. –

1

Cho rằng câu hỏi ban đầu là khoảng một hiệu quả cách để làm điều này trong bash, tôi nghĩ rằng những có thể là mục xứng đáng trong cuộc thi:

INET_ATON() 
    { 
    local IFS=. ip 
    ip=($*) 
    echo $(((ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3])) 
    } 

INET_NTOA() 
    { 
    echo $(($1 >> 24)).$((($1 >> 16) % 256)).$((($1 >> 8) % 256)).$(($1 % 256)) 
    } 

Đương nhiên, những có cùng một "gói" vấn đề như các giải pháp khác đưa ra ở đây, do điều trị vỏ của các số nguyên như đã ký kết.

0

Tôi lười và điều này đã được thực hiện. Vì vậy, từ một vỏ

$ ping -c1 1199092913 | head -n1 | grep -Eow "[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+" 

Tôi chắc chắn có những cách thông minh khác để làm điều đó từ vỏ là tốt.

Các vấn đề liên quan