快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

Linux中怎么获取本机ip

本篇文章给大家分享的是有关Linux中怎么获取本机ip,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

创新互联建站主要从事成都做网站、成都网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务铜官,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108

调用shell:

$ip = `ifconfig eth0|grep -oE '([0-9]{1,3}\.?){4}'|head -n 1`;

注:这里输入是固定的,所以简单的[0-9]{1,3}了,如果是在web程序等地方验证ip,需要更严谨!

或者

$ip = `ifconfig eth0|awk -F: '/inet addr/{split($2,a," ");print a[1];exit}'`;

好吧,这样显得太不perl了,而且频繁的调用外部shell不太好,第二种:

open FH,"ifconfig eth0|";
while(){
last unless /inet addr:((\d{1,3}\.?){4})/;
print $1;
}

看起来稍微perl了一些,虽然实质跟上面的调用shell和grep法是一样的。

第三种,更perl一点,纯粹读文件:

open FH,'<','/etc/sysconfig/network-scripts/ifcfg-eth0';
while(){
next unless /IPADDR\s*=\s*(\S+)/;
print $1;
}

进一步的,如果不一定rh系,还要去读/etc/issue,确定网络配置文件到底是/etc/sysconfig/network-script/ifcfg-eth0还是/etc/network/interfaces还是其他,然后根据不同发行版写不同的处理方法……额,这是打算自己写模块么?

好吧,大家来充分体会CPAN的魅力,去search一下,找到一把Sys::HostIP、Sys::HostAddr、Net::Inetface等模块。第四种:

use Sys::HostAddr;
my $interface = Sys::HostAddr->new(ipv => '4', interface => 'eth0');
print $interface->main_ip;

不过进去看看pm文件,汗,这几个模块都是调用ifconfig命令,不过是根据发行版的不同进行封装而已。

还有办法么?还有,看第五种:

perl -MPOSIX -MSocket -e 'my $host = (uname)[1];print inet_ntoa(scalar gethostbyname($host))';

不过有童鞋说了,这个可能因为hostname的原因,导致获取的都是127.0.0.1……

那么***还有一招。通过strace ifconfig命令可以看到,linux实质是通过ioctl命令完成的网络接口ip获取。那么,我们也用ioctl就是了!

如下:

#!/usr/bin/perl
use strict;
use warnings;
use Socket;
require 'sys/ioctl.ph';
sub get_ip_address($) {
    my $pack = pack("a*", shift);
    my $socket;
    socket($socket, AF_INET, SOCK_DGRAM, 0);
    ioctl($socket, SIOCGIFADDR(), $pack);
    return inet_ntoa(substr($pack,20,4));
};
print get_ip_address("eth0");

这样的好处,就是只调用了核心模块,在分发脚本时,不用连带安装其他模块。

注:这个其实是根据网上有的一个py的脚本修改的,py版如下:

#!/usr/bin/python
import socket
import fcntl
import struct
def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
            s.fileno(),
            0x8915,  # SIOCGIFADDR
            struct.pack('256s', ifname[:15])
    )[20:24])
print get_ip_address('eth0')

以上就是Linux中怎么获取本机ip,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


网站栏目:Linux中怎么获取本机ip
文章转载:http://6mz.cn/article/ggepii.html

其他资讯