<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

    Linux上獲取本機ip的各種perl寫法

     大家討論使用Gearman做分布式處理時,各機需要注冊一個獨立的job作為信息反饋,但是為了方便,Gearman::Worker腳本register_function代碼又要通用,于是想到了使用各自的ip地址作為job命名~

      那么怎么在worker腳本里獲取本機ip作為func呢?

      第一種辦法,最簡單的,調(diào)用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了,而且頻繁的調(diào)用外部shell不太好,第二種:

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

      看起來稍微perl了一些,雖然實質(zhì)跟上面的調(diào)用shell和grep法是一樣的。

      第三種,更perl一點,純粹讀文件:

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

      進一步的,如果不一定rh系,還要去讀/etc/issue,確定網(wǎng)絡(luò)配置文件到底是/etc/sysconfig/network-script/ifcfg-eth0還是/etc/network/interfaces還是其他,然后根據(jù)不同發(fā)行版寫不同的處理方法……額,這是打算自己寫模塊么?

      好吧,大家來充分體會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文件,汗,這幾個模塊都是調(diào)用ifconfig命令,不過是根據(jù)發(fā)行版的不同進行封裝而已。

      還有辦法么?還有,看第五種:

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

      不過有童鞋說了,這個可能因為hostname的原因,導(dǎo)致獲取的都是127.0.0.1……

      那么最后還有一招。通過strace ifconfig命令可以看到,linux實質(zhì)是通過ioctl命令完成的網(wǎng)絡(luò)接口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");

      這樣的好處,就是只調(diào)用了核心模塊,在分發(fā)腳本時,不用連帶安裝其他模塊。

      注:這個其實是根據(jù)網(wǎng)上有的一個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')

    posted on 2011-11-16 13:11 順其自然EVO 閱讀(204) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2011年11月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久亚洲精品人成综合网| 亚洲综合无码一区二区痴汉| 久久国产色AV免费观看| 亚洲AV无码成人专区| 亚洲人午夜射精精品日韩| 免费在线看污视频| 亚洲熟伦熟女专区hd高清| 亚洲乱码中文字幕综合234| 免费看一级做a爰片久久| 久久www免费人成看国产片| 亚洲性色成人av天堂| 亚洲第一永久AV网站久久精品男人的天堂AV | 无码国产精品一区二区免费式影视| 亚洲AV香蕉一区区二区三区| 亚洲毛片αv无线播放一区| 四虎www成人影院免费观看| 东方aⅴ免费观看久久av| 亚洲A∨精品一区二区三区下载| 亚洲AV午夜福利精品一区二区| 女人18毛片a级毛片免费| 久久久久国产精品免费网站| 亚洲aⅴ天堂av天堂无码麻豆| 久久精品国产亚洲AV麻豆网站 | 成人黄页网站免费观看大全| 国产午夜不卡AV免费| 99亚洲乱人伦aⅴ精品| 亚洲伊人久久大香线蕉影院| 亚洲精品午夜国产VA久久成人| 黄a大片av永久免费| 成人免费视频网站www| 两个人日本免费完整版在线观看1| 亚洲欧美日韩自偷自拍| 亚洲成a人片77777群色| 亚洲AV无码精品色午夜在线观看 | 色婷五月综激情亚洲综合| 精品亚洲永久免费精品| 亚洲?v女人的天堂在线观看| 精品久久久久国产免费| 最近2019中文字幕免费直播| 免费在线看污视频| 中文精品人人永久免费|