プロが教える店舗&オフィスのセキュリティ対策術

/proc/sys/net/ipv4/route/flush
というファイルをcatの引数に指定すると
「無効な引数です」と言われます。
普通、読めないファイルの場合は
「許可がありません」というメッセージなのに、
このファイルだけは「無効な引数です」と言われるのです。
エラーメッセージが異なるということは別のエラーということだと思うのですが、
「無効な引数です」というメッセージはどのような場合に表示されるものなのですか。

たとえばwcの引数に指定した場合、次のようにエラーメッセージと通常の結果の両方を表示します。
$ wc /proc/sys/net/ipv4/route/flush
wc: /proc/sys/net/ipv4/route/flush: 無効な引数です
0 0 0 /proc/sys/net/ipv4/route/flush

ですのでエラーメッセージをリダイレクトしてしまえば、何の問題もないように思えるのですが・・・
これでいいのかなぁ。

A 回答 (4件)

Linux で /proc 以下のファイルは特殊なファイルです。

/proc以下のファイルは、カーネルとのインターフェイスになっていて、ファイルとしての実体はありません(man 5 proc 参照)。カーネルの中に、/proc 以下のこのディレクトリにアクセスがあったら、こういう値を出力する(読み込みの場合)、その値をカーネルのこの変数に代入する(書き込みの場合)というようなプログラムが書かれています。

ということで、属性が変更できないのは当然です。ちなみに CentOS 4.4 では

$ ls -l /proc/sys/net/ipv4/route/flush
--w------- 1 root root 0 Nov 21 10:39 /proc/sys/net/ipv4/route/flush

となっています。これを

$ strace wc /proc/sys/net/ipv4/route/flush

とするとどこで、どういうエラーになったか分かります。CentOSの場合、沢山の出力の後、

....
open("/proc/sys/net/ipv4/route/flush", O_RDONLY|O_LARGEFILE) = -1 EACCES (Permission denied)
write(2, "wc:
....

となります。まあ、これはrootでないので当然の結果ですが。
    • good
    • 0
この回答へのお礼

chirubouさん、ご回答ありがとうございます。
なるほど/procは特殊なファイルが置いてある場所なのですね。
普段、何気なく使っているコマンドの引数に、ここのファイルを指定すると想定外の結果が返ってくるのだと覚えておきます。
今、指定したディレクトリー中の全ファイルに対してwcするシェルスクリプトを作成中でして、
まず手始めに、このスクリプトの引数に/を指定してテストしたところ
/proc/sys/net/ipv4/route/flushの所だけ他と違うエラーが返ってきたため、疑問に思って質問に参ったというわけです。
今回は、このような奇妙なエラーが返ってきたのは、このファイルだけですが、
/proc中には、これ以外にも引数に指定した場合、予期せぬエラーを返すファイルがいっぱい潜んでいるというわけですね。

お礼日時:2006/11/21 20:51

こんばんは。



カーネルソースを修正して再構築した事はありますか?

あなたの環境が一言も書いていないので回答できませんが、たとえば
以下のカーネルソースの、flushのmodeを「0644」から「0200」に変更して、
カーネルコンパイルすれば、flushの属性を変えられます。
一度試してみてください。(自己責任で)


●カーネルソースを修正してコンパイルする

「/usr/src/linux-2.4.20-8/net/ipv4/route.c」

ctl_table ipv4_route_table[] = {
    {
        ctl_name:    NET_IPV4_ROUTE_FLUSH,
        procname:    "flush",
        data:      &flush_delay,
        maxlen:     sizeof(int),
        mode:      0644, <-これを0200に変更
        proc_handler:  &ipv4_sysctl_rtcache_flush,
        strategy:    &ipv4_sysctl_rtcache_flush_strategy,
    },



●ソース変更前の属性は644
# ls -l /proc/sys/net/ipv4/route/flush
-rw-r--r--  1 root   root      0 11月 22 00:08 /proc/sys/net/ipv4/route/flush

# wc /proc/sys/net/ipv4/route/flush
wc: /proc/sys/net/ipv4/route/flush: 無効な引数です
   0    0    0 /proc/sys/net/ipv4/route/flush

●ソース変更後の属性は200になった
# ls -l /proc/sys/net/ipv4/route/flush
--w-------  1 root   root      0 11月 22 00:50 /proc/sys/net/ipv4/route/flush

# wc /proc/sys/net/ipv4/route/flush
wc: /proc/sys/net/ipv4/route/flush: 許可がありません


以上、参考にしてください。
    • good
    • 0
この回答へのお礼

xjdさん、ご返信ありがとうございます。
カーネルコンパイルですか。

xjdさんのアドバイス文を見ながら
ソース修正まではできましたが、
カーネルコンパイルというのは、よく分からないので、やめておきますw

とにかく、これでカーネルコンパイルというのをやれば、
できないと思っていた/proc/sys/net/ipv4/route/flushの属性を変更することもできてしまうのですね!

ところでみなさん、そろって--w-------という属性に変更しているようですが、これはどういう理由からなのでしょうか。
それとも環境によってデフォルトの属性が違うだけなのでしょうか。

ちなみに申し遅れましたが私の環境はRed Hat Linux8.0の最小インストール+α(サンバとかの各種サーバー)です。

お礼日時:2006/11/22 22:42

>なるほど/procは特殊なファイルが置いてある場所なのですね。



/procは、プロセス情報を含む擬似的なファイルシステムですので、ディスク上には存在しませんのでファイルが置いてあるというよりは、ファイルとして見えているという事になります。

/proc/sys配下だけに限定すると、カーネルにはチューニング等を行うためのカーネルパラメータというものが存在するのですが、それが/porc/sys配下に階層構造でファイルとして見えています。

例えば、パケット転送の有効・無効を設定するパラメータとしてnet.ipv4.ip_forward というのがあるのですが、これは、/proc/sys/net/ipv4/ip_forward として見えます。


# sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 0
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

# ls -l /proc/sys/net/ipv4/ip_forward
-rw-r--r-- 1 root root 0 11月 21 22:19 /proc/sys/net/ipv4/ip_forward
# cat /proc/sys/net/ipv4/ip_forward
0

また、カーネルパラメータはカーネル起動中でもsysctlコマンドを使用する事で参照・変更する事が可能なものがあるのですが、このsyscltコマンドを使用しなくとも/proc/sys配下の該当するファイルに対してread/writeする事で同様事が可能です。


# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
# cat /proc/sys/net/ipv4/ip_forward
1
# echo "0" > /proc/sys/net/ipv4/ip_forward
# cat /proc/sys/net/ipv4/ip_forward
0
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
    • good
    • 0
この回答へのお礼

Leanさん、ご返信ありがとうございます。
/procは概念自体、理解しがたいものですね。
ファイルが存在するのではなく、見えるのですね・・・^^
/proc中のほとんどのファイルサイズは0ですが、中には0でないものもあります。
こういうファイルも実際のディスク領域に書き込まれているわけではなく、どこかの設定ファイルへのリンクのようなものなのでしょうかね。
カーネルパラメータの2通りの変更方法もためになりました。
まあ、これらを使用するためには、各カーネルパラメータの意味を学習する必要がありますけどね。

/proc/sys/net/ipv4/ip_forwardはcatできるのですね。

お礼日時:2006/11/22 22:15

うちのFedoraCore5では特に問題ないです。



$ pwd
/proc/sys/net/ipv4/route

$ ls -l flush
--w------- 1 root root 0 11月 20 22:25 flush

$ wc flush
wc: flush: 許可がありません

$ cat flush
cat: flush: 許可がありません
    • good
    • 0
この回答へのお礼

mtfoggyさん、早速のご回答ありがとうございます。
mtfoggyさんの実行結果を見てふと気になったのがflushの属性です。
私の環境では-rw-r--r--となっているのです。
ですので、これをmtfoggyさんと同じ属性に変更しようとしたところ・・・
「許可されていない操作です」と怒られてしまいました。
なんとrootユーザーは全ての操作を実行できると認識していたのですが、
この謎めいたファイルには効きませんでした。

mtfoggyさんのflushには読み取り属性がないため、
「無効な引数です」と怒られるところまで行き着いていないのではと思い、
それを実験してみようと思ったのですが、属性すら変更できないとは予想外でした!!

ところでmtfoggyさんのflushの属性ってデフォルトでその設定なのですか。
所有者の書き込みのみ許可されているとは、これまた謎めいたファイルですね。

うーーん、どうしたもんだろう??

お礼日時:2006/11/20 23:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!