• ベストアンサー
  • 暇なときにでも

/proc/sys/net/ipv4/route/flushは無効な引数?

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

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数1674
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2

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でないので当然の結果ですが。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

その他の回答 (3)

  • 回答No.4
  • xjd
  • ベストアンサー率63% (1021/1612)

こんばんは。 カーネルソースを修正して再構築した事はありますか? あなたの環境が一言も書いていないので回答できませんが、たとえば 以下のカーネルソースの、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: 許可がありません 以上、参考にしてください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

xjdさん、ご返信ありがとうございます。 カーネルコンパイルですか。 xjdさんのアドバイス文を見ながら ソース修正まではできましたが、 カーネルコンパイルというのは、よく分からないので、やめておきますw とにかく、これでカーネルコンパイルというのをやれば、 できないと思っていた/proc/sys/net/ipv4/route/flushの属性を変更することもできてしまうのですね! ところでみなさん、そろって--w-------という属性に変更しているようですが、これはどういう理由からなのでしょうか。 それとも環境によってデフォルトの属性が違うだけなのでしょうか。 ちなみに申し遅れましたが私の環境はRed Hat Linux8.0の最小インストール+α(サンバとかの各種サーバー)です。

  • 回答No.3
  • Lean
  • ベストアンサー率72% (435/603)

>なるほど/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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.1
  • mtfoggy
  • ベストアンサー率14% (37/255)

うちの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: 許可がありません

共感・感謝の気持ちを伝えよう!

質問者からのお礼

mtfoggyさん、早速のご回答ありがとうございます。 mtfoggyさんの実行結果を見てふと気になったのがflushの属性です。 私の環境では-rw-r--r--となっているのです。 ですので、これをmtfoggyさんと同じ属性に変更しようとしたところ・・・ 「許可されていない操作です」と怒られてしまいました。 なんとrootユーザーは全ての操作を実行できると認識していたのですが、 この謎めいたファイルには効きませんでした。 mtfoggyさんのflushには読み取り属性がないため、 「無効な引数です」と怒られるところまで行き着いていないのではと思い、 それを実験してみようと思ったのですが、属性すら変更できないとは予想外でした!! ところでmtfoggyさんのflushの属性ってデフォルトでその設定なのですか。 所有者の書き込みのみ許可されているとは、これまた謎めいたファイルですね。 うーーん、どうしたもんだろう??

関連するQ&A

  • シェルのリダイレクトとパイプについて

    シェルのリダイレクトとパイプについての質問です. リダイレクトでコマンドの標準出力をファイルに指定した後に, パイプを置いて,もう一つコマンドを並べたとき, 後の方のコマンドの標準入力はどうなるのでしょうか? 例えば, ls >outfile |cat ならば, catの標準入力には,何も入ってこないと思うのですが, これを実行すると,lsの結果がoutfileに書き込まれ, 次のプロンプトが表示されます. 普通,catを引数なしで実行すると, EOFが入力されるまで,入力待ちになると思うのですが, こうならないのは,シェルがcatの標準入力にEOFを入力したからだと 考えていいのでしょうか. よろしくお願いします. (質問の意味が分かりにくければご指摘下さい.)

  • パケット中継機能を有効にする時は?

    RedHat Linux9を使用して、DMZ側にサーバを立てました。 パケット中継機能を有効にするために、 echo 1 > /proc/sys/net/ipv4/ip_forwart というのがありますが、 これはDMZ側のサーバで実行する必要がありますか? パケット中継機能を有効にするという意味がちょっと良くわからないのですが。

  • Linuxのファイルハンドルとファイルディスクリプタの違い

    こんにちわ。 Linuxのファイルハンドルおよびファイルディスクリプタについて質問があります。 /proc/sys/fs/file-nrにはファイルハンドルに関する3つの値があるかと思います が、それとは別にulimit -aを実行したときに表示されるopen filesの値があるか と思います。 後者のulimitで表示されるopen filesの値はファイルディスクリプタの最大値だと 理解しておりますが、これと上記/proc/sys/fs/file-nr、/proc/sys/fs/file-max で表示されるファイルハンドルの最大数との関連性がわからなくなって来ました。 ファイルハンドルはファイルを開く際にメモリ上に確保されるエリア、 ファイルディスクリプタはオープンしたファイルに割り当てられた 識別子という理解は間違ってるのでしょうか? そもそもulimitはユーザの制限なので/proc/sys/fs/file-maxで設定 されている以上の値(ファイル管理テーブルの最大エントリ数)をopen filesには指定 できないという理解でいいでしょうか?

  • linuxをルーターとして使用。

    前にDNSの事で質問したものです。 CATVで、cクラス未満のIPを割り当ててもらって、4台のPC(3台win 1台linux)ネット接続しています。 で、linuxの一台をルーター兼用で使ってたのですが、 他の3台が外部にでれなくなってしまいました。  linuxのものは、外部に出れるのです。  他の3台もこのルーター(linuxのもの)までは、pingが届くので、素人考えでip_forwardができなくなったと思って、 /proc/sys/net/ipv4/ip_forward を見たのですが、そのファイルの中身は1と入ってるだけだったのですが、ここが問題なのでしょうか? それとも、まったく筋違いなのでしょうか?

  • 自動起動のサーバーのtoo many open filesについて

    socket通信の簡単なサーバーを作っているのですが、クライアントの数が多くなるとtoo many open filesと出てしまい、困っています。 普通に(sshでログインして)サーバーを起動すると、2000以上のクライアントを受け付けることができるのですが、同じ物をinittabやrc.localから起動すると、1000付近で上記のエラーが出て、それ以上の接続を受け付けなくなってしまいます。 lsofでディスクリプタの数を数えると、1080で止まるようでした。ソケットだけなら1000に届いていないと思います。 色々と設定を変えてみたのですが、自分では原因を追及できませんでした。 ご存じの方、何卒対策を教えていただけないでしょうか。 よろしくお願い致します。 環境は、Fedora Core 5(2.6.15-1.2054_FC5)、ファイルディスクリプタ関連の設定は > ulimit -n 65535 > cat /proc/sys/fs/file-max 65535 > cat /proc/sys/net/core/somaxconn 10240 となっています。

  • TurboLinux6.1で静的ルートを追加したが、マシン再起動後に設定が消えてしまう

    TurboLinux6.1/Serverで静的ルートを追加しましたが、 マシンを再起動した後、「netstat -rn」で確認すると 追加していたはずの設定が消えてしまいます。 再起動すると、消えてしまうものなのでしょうか? または、再起動する前に、保存を確実に行うための手段が必要なのでしょうか? <追加例>  /sbin/route add -net 192.168.0.0 netmask 255.255.255.0 gw 10.132.1.10 metric 1 ちなみに、「route add」コマンドで経路表追加後、 「cat /proc/net/route」コマンドを実行して確認すると、 正常に追加されています。 (しかし、再起動すると消えてしまうんです。)

  • Linuxについて

    Linuxのスクリプトについて Linuxのスクリプトについての質問です #/bin/sh n=$1 while [ $n -le $2 ]; do echo "year $n" cal $n n=`expr $n + $3` done という引数に応じてカレンダーを出力するスクリプトを作成しました。 このスクリプトは引数が2つの場合は、1年ごとのカレンダーが表示されます。 ここに、引数が2つより少ないときはエラーメッセージを出力してプログラムを終了する機能をつけたいのですが 方法がよくわかりません。 #!/bin/bash # 実行時に指定された引数の数、つまり変数 $# の値が 3 でなければエラー終了。 if [ $# -ne 3 ]; then echo "指定された引数は$#個です。" 1>&2 echo "実行するには3個の引数が必要です。" 1>&2 exit 1 fi # ヒアドキュメントでメッセージを表示する。 cat <<__EOT__ 指定された引数は、 $1 $2 $3 の$#個です。 __EOT__ exit 0 このスクリプトをなんとか応用すればできると思うのですが なにせ初心者なもので;; ちょっと複雑になるとすぐに頭が混乱してしまう所存です・・・ どなたかご親切な方のご回答をお待ちしています。

  • argv( 引数 )について

    こんにちは、質問させてください。 今test.phpに引数をひとつ渡します。 test.php内では、 $name = $_GET["name"]; として受けています。 test.phpは、引数がNULLの時とそうでないときで 別処理を行うようにしています。 PHP.iniファイルのエラーメッセージを表示させるように設定していて、 引数が存在しないときに以下のようなメッセージがエラーログファイルに追加されます。 Undefined index: name in c:\htdocs\test\test.php on line 12 このメッセージが表示されること自体、たいしたエラー(?!)ではありませんが、 引数がない場合、実行する度に上記のメッセージがでるのはあまり 面白くないので、表示させたくないようにしたいのですが, どのようにすればいいでしょうか? 宜しくお願い致します m(_ _)m

    • ベストアンサー
    • PHP
  • コマンド教えて下さい

    新しく更新された順にファイルの一覧を表示したいのですが、このとき表示させるファイルの数を引数で指定するコマンドを作りたいのですが、どうすればよいでしょうか? 例えば /home/pp ディレクトリ以下の全てのファイルを対象に、最近更新のあったものを新しい順に10個表示させたいとします。このとき10を引数で指定します。 こういうコマンドって作れますか?

  • ファイルのダウンロード時のエラーの処理について

    Dim wc As New System.Net.WebClient wc.DownloadFile("http://oshiete1.goo.ne.jp/images_goo/goo.gif", "C:\goo.gif") というコードでファイルをダウンロードする場合に ファイルが存在すれば良いのですが、 指定の場所に指定のファイルがなかった場合や 指定したサーバー自体が見当たらない場合や、 返答がなく異常に時間がかかった場合の処理をしたいです。 on Error goto を使うとエラー番号で[5]が出るのですが、 エラールーチンを設けないとデバッグのメッセージで サーバー関係のエラーのメッセージ(404とか)が表示されるのですが、 そのような具体的なエラー番号やエラーの状態をプログラム内で 得るにはどうしたら出来るでしょうか。 何か良い方法がありましたら、ご教示頂きたく、お願い致します。m(__)m