質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

4回答

12325閲覧

/etc/network/interfacesをコマンドで編集する

hoge_beginner

総合スコア16

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2016/10/19 10:40

編集2016/10/20 00:28

###前提・実現したいこと
組み込みLinux環境でNICに固定IPを割り当て、割り当てた固定IPを再起動した後も保持したいと思っています。
/etc/network/interfacesの編集をsystem関数などからコマンドを起動して行いたいのですが、どのようなコマンドを使用すれば分からず設定が保持できていません。
コマンド等で/etc/network/interfacesを編集するような方法はないでしょうか?

システム要件としてもディストリビューションに極力依存しないコードとすることとなっており、/etc/network/interfacesを直接編集することができません。
viやsedで直接書き換えるのは禁止されています。
ディストリビューションに依存しないで使用できるコマンドなどはないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

/etc/network/interfacesファイルが次の内容とします。

allow-hotplug eth0 iface eth0 inet static address 192.168.11.100 netmask 255.255.255.0 gateway 192.168.11.1 dns-domain example.com dns-nameservers 192.168.11.1

IPアドレスを999.999.999.999に変更する場合は次のコマンドをsystem()関数に渡せばいけます。

※10/20 7:34 修正
※sが抜けていたので追記

※10/20 8:52 修正
※正規表現パターンが抜けていたので追記

system("sed -i -e 's/^ address .*$/ address 999.999.999.999/' /etc/network/interfaces");

非rootで実行する場合はsudoを追加してください。

system("sudo sed -i -e 's/^ address .*$/ address 999.999.999.999/' /etc/network/interfaces");

投稿2016/10/19 13:26

編集2016/10/19 23:52
moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hana-da

2016/10/19 15:32

's/^ address .*/ address 999.999.999.999/' ですかねぇ。。。 あと -i は gnu sed (gsed)でしか使えないので要注意です。
moonphase

2016/10/19 23:55 編集

ありがとうございます。s抜けてましたね、修正しました。 -i が使えない場合はcp+sedやファイル内容全体を出力するのはいかがでしょう。 ■cp+sed cp -p /etc/network/interfaces /etc/network/interfaces.orig && sed -e 's/^ address .*$/ address 999.999.999.999/' /etc/network/interfaces.orig > /etc/network/interfaces chown root:root /etc/network/interfaces chmod 644 /etc/network/interfaces ■ファイル内容全体を出力 cat<<EOF>/etc/network/interfaces allow-hotplug eth0 iface eth0 inet static address 192.168.11.100 netmask 255.255.255.0 gateway 192.168.11.1 dns-domain example.com dns-nameservers 192.168.11.1 EOF
hana-da

2016/10/19 23:05

すいません使えないというのは表現がよくなかったです。 正確に言うとオプションの意味が違います。 ので GNU$ sed -i 's/^ address .*/ address 999.999.999.999/' /etc/network/interfaces と同じ事をやるときは BSD$ sed -i '' 's/^ address .*/ address 999.999.999.999/' /etc/network/interfaces になります。 ちなみに cp -p /etc/network/interfaces /etc/network/interfaces.orig && sed 's/^ address / address 999.999.999.999/' /etc/network/interfaces.orig > /etc/network/interfaces は cp -p /etc/network/interfaces /etc/network/interfaces.orig && sed -e 's/^ address / address 999.999.999.999/' /etc/network/interfaces.orig > /etc/network/interfaces ですね '-e' が抜けてます。 (まぁコメント欄扱いにくいですしね。。。。)
hana-da

2016/10/19 23:07

あ、あと本文 .* も抜けてます。
moonphase

2016/10/19 23:56

重ね重ねありがとうございます。 普段'-e'オプションなしで利用してました、環境によって動きますがあったほうが分かりやすいですね .*は完全にぼけてましたので、追記しました! BSD系は意味が違うんですね。
hoge_beginner

2016/10/20 00:32

回答ありがとうございます。 今回の開発では/etc/network/interfacesを直接編集することが禁止されているため回答いただいた内容では対応できない状況です。 なにか別のコマンドなどで変更できないでしょうか?
moonphase

2016/10/20 00:45 編集

ディストリビューションによって恒久的にIPを指定できるものはありますが、何をお使いでしょうか? もしくは/etc/network/interfacesの編集は諦めて、起動時にifconfigコマンドでIPアドレスを割り当てればどうでしょうか。 あと、DHCPがデフォルトでONになっているならMacアドレスと固定IPを関連付けて、DHCPサーバで配布等が楽です。
hoge_beginner

2016/10/20 00:58

現状はDebianベースのものを使用していますが、ディストリビューションは決定していません。ディストリビューションを決定するための予備調査みたいなプロジェクトなんです。 最終的にDebian系からredHat系に変更される可能性もあります。 Debian系からredHat系に変更する時に使用するコマンドを1行変更するだけで対応できる等なら良いのですが、変更するファイルや形式が大きく変わってしまうような対応方法(設定ファイルを直接編集するなど)は避けたいです。 設定ファイルをいじる以外に恒久的な設定を変更するコマンドがないということなら、ディストリビューション依存箇所として対応検討になってしまうので。
moonphase

2016/10/20 01:16

ディストリビューションによってインタフェース名が変わる場合がありますが、そのような前提条件があるならifconfigとrouteコマンドがいいのではないでしょうか。 一時的な変更になります ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 route add default gw 192.168.1.254 RHEL7系であればコマンドで恒久対応できます。 nmcli connection modify eno1 ipv4.addresses "192.168.0.1/24 192.168.0.254" systemctl restart NetworkManager どのOSやディストリビューションになっても共通の方式で行える方法はないです。 シェルスクリプトでディストリビューションを判定し、処理を分岐するなど検討すればいかがでしょうか。 Debian系ならこう、RHEL6系ならこう、RHEL7系ならこうと調査しておけば問題ないかと思います。
hoge_beginner

2016/10/20 01:40

なるほど。ディストリビューションに大きく依存する箇所なんですね。 ネットワーク設定に関してはディストリビューション依存箇所としてそれぞれ対処方法を検討したいと思います。
guest

0

組み込み環境との事ですのでまずはどのようなツールが利用可能な状態にはっているのかを調べるところからだと思います。

sedコマンドあたりが使えれば何でもできるのですが。。。。どうですかね?

投稿2016/10/19 13:17

hana-da

総合スコア1728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoge_beginner

2016/10/20 00:34

回答ありがとうございます。 busyboxが入っているので大体のコマンドは使えますが、直接的に/etc/network/interfacesは編集できないのでsed等で対応ができない状況です。
guest

0

具体的にどういうプラットフォームをお使いかわかりませんが、組み込み用途だと、たとえば、カスタマイズしたいファイルなどを内蔵の不揮発性メモリに入れておき、ブート時にシステムに転送する、といった機能を持つものもあると思います。

まずは、お使いのハードウェア製品のサポート窓口に、ご自身の具体的な要求を伝えて、解決策の提案をもらってはどうでしょうか。

投稿2016/10/19 12:48

ikedas

総合スコア4315

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoge_beginner

2016/10/20 00:40

回答ありがとうございます。 プラットフォームを決定するための予備調査みたいなプロジェクトで予算の関係でテクニカルサポートがついていません。 Linuxのどのディストリビューションを使用するか確定していないので、ディストリビューション毎に異なってしまうファイルを直接編集するようなことは避ける必要があります。
guest

0

vi・vim等のテキストエディターで編集できませんか?

投稿2016/10/19 11:14

pond

総合スコア350

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoge_beginner

2016/10/20 00:21

回答ありがとうございます。 busyboxが入っているのでviは使えるのですが、システム要件で/etc/network/interfacesを直接編集することが禁止されているのでコマンド等を使用する必要があります。
pond

2016/10/21 08:53

echoコマンドでファイルへの書き込みはいかでしょうか? 例)echo Hello >> /etc/network/interfaces
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問