お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2009-09-19 19:51:36

tranz
新しいメンバ
登録日: 2009-09-19

DHCPで取得したIPアドレス情報の取得について

お恥ずかしい内容かもしれませんが質問させて頂きます。

USBフラッシュメモリに9.04サーバを稼働させております。
このサーバではdhcpクライアント、httpdも稼働しており、やりたいこととしてはブート後に

http://「DHCPで取得したIPアドレス」/hoge/hoge.htmlにアクセスしてね

とメッセージを表示させたいと思っています。
ところが、サーバ版に関わらず、USBでブートするとネットワークインターフェース名が
eth0 eth1
など、ころころ変わる事があるので、スクリプト等に毎回eth0等固定で記述出来ません。

ifconfigの出力結果から抜き出す方法や、ioctl等を利用するも、
これらでは「特定のネットワークデバイス名で稼働しているIPアドレス」や
「特定のIPアドレスで稼働しているネットワークデバイス名」は抽出出来たのですが、

「DHCPサーバから取得した現在のIPアドレス」

が抜けそうになく、行き詰まってしまっております。

dhcp状態のログ等を利用すれば出来そうな気もしますが、
何か良い方法がありましたら是非教えていただければと思います。

オフライン

 

#2 2009-09-19 20:09:29

hmatsue
アドバイザ
登録日: 2009-03-10

Re: DHCPで取得したIPアドレス情報の取得について

NICが二枚ささっていたりするのでしょうか。
ぱっと思いつくのは、
env LANG=C ifconfig eth | head -n2 | tail -n1
みたいな感じでよいと思うのですが、NICが二枚いるとしても同じSubNetに接続はしないと思うので、
env LANG=C ifconfig | grep [例えば192.168.100]
みたいな感じでよいのでは。
作りかけのスクリプトと、その実行結果、求める実行結果を提示いただけると、コメントがつきやすくなるかと思います。

オフライン

 

#3 2009-09-20 15:59:23

tranz
新しいメンバ
登録日: 2009-09-19

Re: DHCPで取得したIPアドレス情報の取得について

さっそくのお返事ありがとうございます。
作成中のUSBメモリは不特定多数の端末で利用する事を想定しており、
状況によってはおっしゃる通りNICが複数ある端末でも稼働する可能性があります。
加えて、またこれとは別に、NICが1枚しか存在しない端末の場合でも、
eth0の最後の数字がかわってしまい、eth1として認識してブートしてくる事があったりします。

hmatsue による投稿:

env LANG=C ifconfig eth | head -n2 | tail -n1
env LANG=C ifconfig | grep [例えば192.168.100]
みたいな感じでよいのでは。

御教授頂いた手法ですと、あらかじめDHCPクライアントとして稼働しているインターフェースが判明していないと
抽出が出来ないと思います。

以下、作成中のプログラムです。

---netipget.c---


#include <stdio.h>

#include <string.h> /* for strncpy */

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>

int
main()
{
int fd;
struct ifreq ifr;

fd = socket(AF_INET, SOCK_DGRAM, 0);

ifr.ifr_addr.sa_family = AF_INET;

strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);

ioctl(fd, SIOCGIFADDR, &ifr);

close(fd);

printf("Please access\n\nhttp\:\/\/%s\/wwwdata\/\n\n\n\n\n\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));

return 0;
}

------
つまり、"http://" + DHCPから取得したIPアドレス + "ファイルパス"
という文字列を生成させており、sedやawkを利用してもcで書いても実行結果としてはこれで満足しています。

VM-ware ESXiの初期画面のような挙動、といったほうが分かりやすいかもしれません。
目的は同一ネットワークセグメントの他の端末からUSBメモリでブートしたサーバにhttpdアクセスをさせる事です。

が、中身を見ていただければ分かりますが、インターフェース名として「eth0」を固定させてしまっているため、
これ以外のデバイスでシステムがブートしDHCP配給を受けた場合に不都合が生じます。

そこでこの処理の前の段階として、
「どのネットワークインターフェイスがDHCPからアドレス配給を受けているかを抽出」
し、上記プログラムにインターフェース名渡して取得しているIPアドレスを抽出?等する必要があると思われます。

ifconfigのlo:インターフェース以外で「RUNNING」なステータスのインターフェース名を抜いて渡したりとか、
#あ、それじゃLANケーブル2本刺さってると駄目ですね・・・
いい方法がないか引き続き考えてみます。
なにか良いヒントあれば宜しくお願いします。

オフライン

 

#4 2009-09-20 16:04:14

tranz
新しいメンバ
登録日: 2009-09-19

Re: DHCPで取得したIPアドレス情報の取得について

以下訂正致します。

tranz による投稿:

つまり、"http://" + DHCPから取得したIPアドレス + "ファイルパス"



つまり、"http://" + インターフェース「eth0」のIPアドレス + "ファイルパス"

オフライン

 

#5 2009-09-20 16:26:13

hito
管理者
登録日: 2007-03-18

Re: DHCPで取得したIPアドレス情報の取得について

cat /var/log/syslog | egrep 'dhclient: bound to' した結果をパースして逆順に読む、ではダメでしょうか。

# 複数のインターフェースが存在していて、それぞれ異なるネットワークの異なるDHCPサーバに接続している、とかを考え始めるとコレでも駄目な予感はするのですが、そうした仮定はあまり起こらないと思うのでそれは平気なハズ……。

オフライン

 

#6 2009-09-21 17:49:24

tranz
新しいメンバ
登録日: 2009-09-19

Re: DHCPで取得したIPアドレス情報の取得について

お返事ありがとうございます。教えていただいた方法を利用し、うまくいきました!

hito による投稿:

cat /var/log/syslog | egrep 'dhclient: bound to' した結果をパースして逆順に読む、ではダメでしょうか。

less /var/log/syslog |egrep 'dhclient: bound to' |sed -n '$p'|cut -d' ' -f8

と、基本計算機リテラシ不足が見え隠れしますが(ぉ
syslogから特定文字列を切り出し、最下行の8フィールド目(IPアドレス)を抜き出すことになんとか成功しました。
スクリプト内部でechoにかまして満足しております。
同じ手法でDHCPREQUESTな部分を利用すると活動中のネットワークデバイス名も抽出出来、
ピンポイントな処理も行えるようになりました。
ありがとうございました。

オフライン

 

Board footer

Powered by FluxBB