<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,大家請?jiān)L問 http://qaseven.github.io/

    Linux上獲取本機(jī)ip的各種perl寫法

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

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

      第一種辦法,最簡單的,調(diào)用shell

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

      注:這里輸入是固定的,所以簡單的[0-9]{1,3}了,如果是在web程序等地方驗(yàn)證ip,需要更嚴(yán)謹(jǐn)!

      或者

    $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了一些,雖然實(shí)質(zhì)跟上面的調(diào)用shell和grep法是一樣的。

      第三種,更perl一點(diǎn),純粹讀文件:

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

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

      好吧,大家來充分體會(huì)CPAN的魅力,去search一下,找到一把Sys::HostIP、Sys::HostAddr、Net::Inetface等模塊。第四種:

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

      不過進(jìn)去看看pm文件,汗,這幾個(gè)模塊都是調(diào)用ifconfig命令,不過是根據(jù)發(fā)行版的不同進(jìn)行封裝而已。

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

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

      不過有童鞋說了,這個(gè)可能因?yàn)閔ostname的原因,導(dǎo)致獲取的都是127.0.0.1……

      那么最后還有一招。通過strace ifconfig命令可以看到,linux實(shí)質(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ā)腳本時(shí),不用連帶安裝其他模塊。

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

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产福利电影一区二区三区,免费久久久久久久精 | 久久亚洲精品无码观看不卡| 一区二区亚洲精品精华液| 日本XXX黄区免费看| 国产精品高清视亚洲精品| www.999精品视频观看免费| 亚洲日本国产综合高清| 夫妻免费无码V看片| 久久无码av亚洲精品色午夜| 免费一级特黄特色大片在线观看| 日韩精品无码永久免费网站| 久久精品国产精品亚洲| 成人性生交大片免费看好| 亚洲五月激情综合图片区| 91精品国产免费久久久久久青草 | 四虎免费影院4hu永久免费| www成人免费观看网站| 亚洲AV综合色区无码另类小说| 91久久精品国产免费直播| 亚洲精品无码成人片久久不卡| 日韩精品成人亚洲专区| 免费观看在线禁片| 亚洲av永久无码精品天堂久久 | 美女视频黄频a免费| 国产亚洲综合成人91精品 | 日本免费网站视频www区| 亚洲avav天堂av在线网毛片| 中文字幕第一页亚洲| 182tv免费视视频线路一二三| 亚洲久悠悠色悠在线播放| 亚洲国产精品毛片av不卡在线| 成全高清在线观看免费| 亚洲人成7777| 国产亚洲精久久久久久无码77777| 四虎国产成人永久精品免费| 亚洲国产精品无码观看久久| 亚洲AV无码一区二区二三区软件| 女人被免费视频网站| 久久精品国产免费一区| 久久精品亚洲日本波多野结衣 | 精品国产免费一区二区三区|