링크 ux 에서 perl 을 사용 하여 이 컴퓨터 ip 를 가 져 오 는 몇 가지 방법 에 대한 소개

3412 단어 perl본기 ip
Gearman 을 분포 식 으로 처리 할 때 각 기 계 는 하나의 독립 된 job 를 정보 피드백 으로 등록 해 야 합 니 다.편 의 를 위해 Gearman::Worker 스 크 립 트 registerfunction 코드 가 또 통용 되 기 때문에 각자 의 ip 주 소 를 job 이름 으로 사용 할 생각 을 했 습 니 다.
그럼 어떻게 worker 스 크 립 트 에서 이 컴퓨터 ip 을 func 로 가 져 옵 니까?
첫 번 째 방법,가장 간단 한 것 은 셸 을 호출 합 니 다

$ip = `ifconfig eth0|grep -oE '([0-9]{1,3}\.?){4}'|head -n 1`;
주:여기 입력 은 고정 되 어 있 기 때문에 간단 한[0-9]{1,3}입 니 다.웹 프로그램 등에 서 ip 을 검증 하려 면 더욱 엄밀 해 야 합 니 다!또는:

$ip = `ifconfig eth0|awk -F: '/inet addr/{split($2,a," ");print a[1];exit}'`;
그래,이 건 너무 perl 이 아 닌 것 같 고 외부 셸 을 자주 호출 하 는 것 도 좋 지 않 아.
두 번 째: 

  open FH,"ifconfig eth0|";
    while(<FH>){
        last unless /inet addr:((\d{1,3}\.?){4})/;
        print $1;
}
약간 perl 된 것 같 습 니 다.실질 적 으로 위의 호출 셸 과 grep 법 과 같 지만.
세 번 째,좀 더 perl,순수한 파일 읽 기:

open FH,'<','/etc/sysconfig/network-scripts/ifcfg-eth0';
    while(<FH>){
        next unless /IPADDR\s*=\s*(\S+)/;
    print $1;
}
더 나 아가 rh 학과 가 아니라면/etc/issue 를 읽 고 네트워크 프로필 이/etc/sysconfig/network-script/ifcfg-eth 0 인지/etc/network/interfaces 인지 확인 한 다음 발행 판 에 따라 다른 처리 방법 을 쓰 시 겠 습 니까?
좋 습 니 다.여러분 은 CPAN 의 매력 을 충분히 체험 하고 검색 해서 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 명령 을 통 해 알 수 있 듯 이 Liux 는 실질 적 으로 ioctl 명령 을 통 해 완 성 된 네트워크 인터페이스 ip 를 통 해 가 져 옵 니 다.그럼 우리 도 ioctl 로 하면 돼!
여섯 번 째 종 류 는 다음 과 같다.
4.567913.이러한 장점 은 핵심 모듈 만 호출 하고 스 크 립 트 를 배포 할 때 다른 모듈 을 설치 하지 않 아 도 된다 는 것 이다.
주:이것 은 사실 인터넷 에 있 는 py 스 크 립 트 에 따라 수정 한 것 입 니 다.
py 판 은 다음 과 같 습 니 다.

 #!/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");
2012 년 12 월 19 일 증가:logstash 의 input/file.rb 를 찾 았 습 니 다.ruby 버 전:

#!/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')
하지만 puppet 에 서 는 ifconfig 방법 으로 시간 이 있 으 면 관련 내용 을 검색 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기