
Ubuntu日本語フォーラム

ログインしていません。
お恥ずかしい内容かもしれませんが質問させて頂きます。
USBフラッシュメモリに9.04サーバを稼働させております。
このサーバではdhcpクライアント、httpdも稼働しており、やりたいこととしてはブート後に
http://「DHCPで取得したIPアドレス」/hoge/hoge.htmlにアクセスしてね
とメッセージを表示させたいと思っています。
ところが、サーバ版に関わらず、USBでブートするとネットワークインターフェース名が
eth0 eth1
など、ころころ変わる事があるので、スクリプト等に毎回eth0等固定で記述出来ません。
ifconfigの出力結果から抜き出す方法や、ioctl等を利用するも、
これらでは「特定のネットワークデバイス名で稼働しているIPアドレス」や
「特定のIPアドレスで稼働しているネットワークデバイス名」は抽出出来たのですが、
「DHCPサーバから取得した現在のIPアドレス」
が抜けそうになく、行き詰まってしまっております。
dhcp状態のログ等を利用すれば出来そうな気もしますが、
何か良い方法がありましたら是非教えていただければと思います。
オフライン
NICが二枚ささっていたりするのでしょうか。
ぱっと思いつくのは、
env LANG=C ifconfig eth | head -n2 | tail -n1
みたいな感じでよいと思うのですが、NICが二枚いるとしても同じSubNetに接続はしないと思うので、
env LANG=C ifconfig | grep [例えば192.168.100]
みたいな感じでよいのでは。
作りかけのスクリプトと、その実行結果、求める実行結果を提示いただけると、コメントがつきやすくなるかと思います。
オフライン
さっそくのお返事ありがとうございます。
作成中の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本刺さってると駄目ですね・・・
いい方法がないか引き続き考えてみます。
なにか良いヒントあれば宜しくお願いします。
オフライン
以下訂正致します。
tranz による投稿:
つまり、"http://" + DHCPから取得したIPアドレス + "ファイルパス"
↓
つまり、"http://" + インターフェース「eth0」のIPアドレス + "ファイルパス"
オフライン
cat /var/log/syslog | egrep 'dhclient: bound to' した結果をパースして逆順に読む、ではダメでしょうか。
# 複数のインターフェースが存在していて、それぞれ異なるネットワークの異なるDHCPサーバに接続している、とかを考え始めるとコレでも駄目な予感はするのですが、そうした仮定はあまり起こらないと思うのでそれは平気なハズ……。
オフライン
お返事ありがとうございます。教えていただいた方法を利用し、うまくいきました!
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な部分を利用すると活動中のネットワークデバイス名も抽出出来、
ピンポイントな処理も行えるようになりました。
ありがとうございました。
オフライン