Я пытаюсь определить, был ли мой IP статически или динамично присвоен в Ubuntu 11.04 из C. Самое близкое я приехал, исследует /var/lib/dhcp/dhclient.leases
, но это не изменяется, если статический IP присвоен (поскольку он кэширует арендные договоры DHCP для будущих попыток подключения).
Так... существует ли утилита командной строки (для Ubuntu), который позволит мне проверять, включен ли DHCP или отключен?
Кроме того: машина является сервером, выделенным одному приложению; было бы легче только поддержать переменную среды, которая отслеживает состояние DHCP?
Можно вставить сценарии /etc/network/if-up.d
выполняться, когда интерфейс активируется (любой ifup
или Администратором сети). Эти сценарии получают информацию об интерфейсе, включая переменную среды $METHOD
набор к static
или dhcp
. Это документируется в interfaces(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
Я предполагаю, что Вы обращаетесь к присвоению 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}'
для списка всех интерфейсов и их конфигурации.
Иначе должен использовать инструменты NetworkManager, а именно, nm-tool
и nmcli
.
Я записал следующий сценарий на этом:
#!/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"
}'
Это, вероятно, прерывает не обычные случаи, например, где Вы имеете больше чем одно активное соединение, но могли быть начальной точкой, которую можно уточнить.
Кроме того, при изменении соединения сценарий будет видеть новые настройки, даже если соединение не было перезапущено, таким образом, они еще не используются.
Я записал, что эта команда для получения DHCP настроила интерфейсы в сценарии оболочки:
ps -A -o cmd | grep -E '(/| )dhclient .'
Затем можно отбросить интерфейсы, не управляемые dhclient
.
В данный момент я не знаю, работает ли это на весь GNU/дистрибутивы Linux.
Его намного более легкое, чтобы решить, что:
Просто отключите машину от сети. Если Вы видите IP-адрес в выводе ifconfig для того интерфейса затем, он статически присвоен иначе динамично.
отношения delaflota