데비안 기반 시스템에서 프로그래밍 방식으로 IP 주소를 얻는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/701004

  •  22-08-2019
  •  | 
  •  

문제

나는 그것을 검색하려고한다 IP Address 내 프로그램의 로컬 컴퓨터의. 운영 체제입니다 Ubuntu 8.10. 나는 사용을 시도했다 gethostname() 그리고 gethostbyname() 검색하려면 IP Address. 내가받은 대답은 127.0.1.1. 나는 그것이 인 것 같다는 것을 배웠다 Debian 물건:여기에 연결된 문서는 아이디어를 설명했습니다.

내 내용 /etc/hosts 파일은 다음과 같습니다.

127.0.0.1 로컬 호스트
127.0.1.1 Mymachine

이 경우 컴퓨터의 시스템 파일을 수정하지 않고 IP 주소를 가져 오기 위해 프로그래밍 방식 (C 또는 C ++ 선호)에 다른 방법이 있습니까?

도움이 되었습니까?

해결책

"NetDevice"를 참조하십시오 man netdevice 또는 웹에서.
그런 다음 siocgifconf를 사용하여 모든 전송 계층 주소를 열거 할 수 있습니다.

편집 (맨 페이지) : man Linux (또는 다른 Unix와 같은 시스템)에서 매우 유용한 명령입니다. 대부분의 명령, 라이브러리 기능, 프로그램 등에 대한 간단한 설명을 보여줍니다. 쉘 프롬프트 열기 및 유형 man ls 또는 man netdevice, 그리고 당신은 내가 무슨 뜻인지 알 수 있습니다.

편집 (IP의 일반적인 검색) : C Way가 너무 지저분하다고 생각하면 가장 쉬운 방법은 (내 머리 꼭대기에서)와 같은 간단한 쉘 스크립트입니다.
ifconfig|grep 'inet addr'|awk '{print $2}'|sed 's/addr://g'

편집 (뇌 솔루션) : 그가하는 일은 if_nameindex () 모든 네트워크 장치 이름을 찾을 수있는 기능과 IP를 찾기 위해 각 이름의 SioCfifConf IOCTL을 찾을 수 있습니다. 그가 말했듯이, 장치 당 하나의 IP 만 나열합니다.

다른 팁

다음은 siocgifconf를 보여주는 빠르고 더러운 코드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    int sock, i;
    struct ifreq ifreqs[20];
    struct ifconf ic;

    ic.ifc_len = sizeof ifreqs;
    ic.ifc_req = ifreqs;

    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0) {
        perror("socket");
        exit(1);
    }

    if (ioctl(sock, SIOCGIFCONF, &ic) < 0) {
        perror("SIOCGIFCONF");
        exit(1);
    }

    for (i = 0; i < ic.ifc_len/sizeof(struct ifreq); ++i)
        printf("%s: %s\n", ifreqs[i].ifr_name,
                inet_ntoa(((struct sockaddr_in*)&ifreqs[i].ifr_addr)->sin_addr));

    return 0;
}

Linux 시스템에서 다음 출력을 얻습니다.

lo: 127.0.0.1
br0: 192.168.0.42
dummy1: 10.0.0.2

따라서 Ken의 요점에 따라 :

ip addr show scope global | grep inet | cut -d' ' -f6 | cut -d/ -f1

데비안 신들이 "IP"명령을 만들었을 때, 그들은 IP 주소 만 얻기 위해 간단한 명령을 추가한다고 생각하지 않았다.

살펴보십시오 NetDevice 남자 페이지. siocgifconf에 전화하여 모든 인터페이스와 주소의 목록을 얻으십시오.

주식에 감사드립니다!

배쉬 솔루션의 경우, 이것은 내가 끝나게 된 것입니다.

#!/bin/bash

/sbin/ifconfig|fgrep 'inet addr:'|fgrep -v '127'|cut -d: -f2|awk '{print $1}'|head -n1

헤드는 다중 고향 및/또는 논리적 인터페이스도 헤드없이 반환되므로 기본 IP가 반환되도록합니다.

따라서 스크립트가 /sbin /get_primary_ip에있는 경우 다음과 같은 작업을 수행 할 수 있습니다.

foo=$(get_primary_ip)

ifconfig는 감가 상각되고 오래되었습니다. iproute2는 새 스택이며 IP 명령을 사용합니다.

IP Addr, 그리고 거기에서 구문 분석.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top