以编程方式检查 IP 是静态的还是动态的

以编程方式检查 IP 是静态的还是动态的

我试图从 C 语言中确定我的 IP 在 Ubuntu 11.04 中是静态分配还是动态分配。我最接近的方法是检查/var/lib/dhcp/dhclient.leases,但如果分配了静态 IP,情况就不会改变(因为它会缓存 DHCP 租约以供将来的连接尝试)。

那么...是否有一个命令行实用程序(用于 Ubuntu)可以让我检查 DHCP 是否启用或禁用?

或者:该机器是专用于一个应用程序的服务器;维护一个跟踪 DHCP 状态的环境变量会更容易吗?

答案1

您可以将脚本放入在/etc/network/if-up.d激活接口时执行的程序(由或由网络管理器激活)。这些脚本接收有关接口的信息,包括设置为或的ifup环境变量。这记录在$METHODstaticdhcpinterfaces(5)手册页

#!/bin/sh
## This is /etc/network/if-up.d/zzzz_alex_notify_myserver
case $LOGICAL in
  eth0)
    case $METHOD in
      dhcp) <notify server that it's on DHCP>;;
      static) <notify server that it's on a static IP configuration>;;
    esac;;
esac

答案2

另一种方法是使用NetworkManager工具,即nm-toolnmcli

我为此写了以下脚本:

#!/bin/sh

# get the connection id of the active connection    
get_con_id() {
  nm-tool |
    awk '
      $1 == "-" {
        dev = $3
        id = dev
        if (NF > 4 && match($0, "\\[(.*)\\]", a))
          id = a[1]
      }
      /^ / && $1 == "State:" && $2 == "connected" {
        print id
      }'
}

# get the address type of the active connection
nmcli con list id "$(get_con_id)" |
  awk '
    $1 == "ipv4.method:" {
      if ($2 == "manual")
        print "static"
      else if ($2 == "auto")
        print "dynamic"
      else
        print "unknown"
    }'

它可能会在非正常情况下中断,例如当您有多个活动连接时,但可能是详细说明的起点。

此外,如果您修改连接,脚本将看到新的设置,即使连接尚未重新启动,因此它们尚未使用。

答案3

我猜你指的是你本地的 ubuntu 机器的 IP 分配,而不是你的外部/公共 IP。

也许以下输出可能会有所帮助:

cat /etc/network/interfaces |grep ^iface\ eth0 | awk -F ' ' '{print $4}'

这将打印单词静止的或者DHCP服务,取决于接口 eth0 的当前配置。

您还可以进行一些小的调整,例如:

cat /etc/network/interfaces |grep ^iface\ | awk -F ' ' '{print $2, $4}'

以列出所有接口及其配置。

答案4

更容易确定的是:

只需断开机器与网络的连接即可。如果您可以在 ifconfig 输出中看到该接口的 ip 地址,则该地址是静态分配的,否则是动态分配的。

问候 delaflota

相关内容