十分な権限なしで実行されたときにiptablesが終了コード3(1の代わりに?)を返す特別な理由はありますか?

十分な権限なしで実行されたときにiptablesが終了コード3(1の代わりに?)を返す特別な理由はありますか?

次のものを使用することを忘れましたsudo

usr@arch ~[0] $ iptables -L
iptables v1.4.21: can't initialize iptables table `filter': Permission
denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
usr@arch ~[3] $ <---

私のものbash PS1プロンプトは、最後のコマンド($?)の終了ステータスを反映します。これiptables マンページ戻りコード3は関係ありません。

さまざまなエラーメッセージが標準エラーに出力されます。通常動作中は終了コードは0です。無効または誤ったコマンドライン引数が原因で発生したエラーの場合は終了コード2が発生し、他のエラーの場合は終了コード1が発生しているようです。

これSUSv3/POSIX議論するコマンドの終了ステータス1mount - エラー条件には7つの異なる終了ステータスがあります。 - マンページに記載されているように、権限なしで実行されたコマンドは1を返します。無効な呼び出しまたは権限


頼む。 それでは、なぜこの点で違うiptablesmountですか?純粋に特定のアプリケーションstrace前の出力で次のような結果を実行するのはなぜですか?ソケット(PF_INET、SOCK_RAW、IPPROTO_RAW)= -1 EPERM(操作は許可されていません)- EACCESでなければなりませんか?許可されていない呼び出しを追跡してもmount同様のエラーが表示されないこれら終了ステータスに影響しますか?それとも、理由にかかわらず-1は失敗ですか?この3つはどこから出たのですか?


1. さらに:牛に似た一種の栄養 Bash;より一般的な;ランダム奇妙な;最近質問参照コードは特定のアプリケーション+歴史/usr/include/sysexits.hなど。

答え1

文書が不完全です。コードには、内部的に使用されるエラーコードの次のリストが含まれています。

enum xtables_exittype {
    OTHER_PROBLEM = 1,
    PARAMETER_PROBLEM,
    VERSION_PROBLEM,
    RESOURCE_PROBLEM,
    XTF_ONLY_ONCE,
    XTF_NO_INVERT,
    XTF_BAD_VALUE,
    XTF_ONE_ACTION,
};

初期化を試みるとき:

if (!*handle)
    xtables_error(VERSION_PROBLEM,
           "can't initialize iptables table `%s': %s",
           *table, iptc_strerror(errno));

xtables_errorエラーメッセージを出力し、指定された終了コードで終了します。

IMHOコードに欠陥があるようです。ここでは、エラーがerrno実際に何であるかを確認せずにバージョンの問題が原因であるとしますEPERM

答え2

終了コードの唯一の規則は、0は成功を意味し、他の値は失敗を意味することです。このルールはUnixを超えています。これは、他のオペレーティングシステム(DOS、Windows、および終了コードの概念を持つ多くの組み込みシステムを含みますが、VMSは異なる方法で実行されます)でも一般的なルールです。 Unixシステムでは、シェルのブール構造(、、、、、、、… )ifとすべてwhileの標準ユーティリティに組み込まれています。 POSIX Cプログラムでは&&||!set -emakeEXIT_SUCCESS0でEXIT_FAILUREゼロ以外の値(通常1)です。

失敗した場合、終了コードの選択に関する規則や普遍的な規則はありません。少数のPOSIXユーティリティだけが特定のエラー状態コードを強制します。

  • cmpそしてdiff個々のファイルの場合は1、エラー状態の場合は≥2を返します。
  • expr式が 0 または null と評価された場合は 1 を返し、式が無効な場合は 2 を返し、その他のエラーでは ≥3 を返します。
  • grep「見つかりません」の場合は1を返し、エラー条件の場合は≥2を返します。多くの検索コマンドがこれに従います(ただし、find一致するファイルがない場合は0を返しません)。
  • mesgYesの場合は0、Noの場合は1、エラーの場合は≥2を返します。
  • patchブロックが拒否された場合は1を返し、その他のエラーの場合は≥2を返します。
  • sort -cファイルデータがソートされていない場合は1を返し、エラーがある場合は≥2を返します。
  • compressそしてlocaledef特定のエラーに対して小さな値を定義します。

大きな値がより深刻な失敗を意味するという共通の信念がありますが、普遍的ではありません。grep(このパターンは存在しますか?)やdiff(このファイルは同じですか)などのブール条件をテストするコマンドの場合、1は「いいえ」を意味し、値が高いほどエラーを示します。また、126で始まる値はシェルに書き込まれるため、ほとんど使用されません(、、およびcommandenvnice126及び127は外部コマンド呼び出しが失敗したことを示し、128以上の値はコマンドが終了したことを示す。信号で。nohuptime$?/usr/include/sysexits.hsendmailから来たので、電子メールシステム、特にprocmailなどのメール配信エージェントでのみ見たことがあります。

多くのプログラムは常に1を返し、失敗した場合は常に2を返します。iptablesいくつかの異なるエラーコードを定義することがあります。

表示される戻り値straceは次のとおりです。システムコール。システムコールはエラーを示すために-1を返し、エラーコードを次の場所に保存します。errno変えるStrace はerrno戻りコードの後の括弧内に値を表示します。EACCES(「権限が拒否されました」)と(「操作が許可されていません」)の違いはEPERM少し微妙です。EACCESこれは、ターゲットオブジェクトに対する権限が操作を許可しないことを意味し、他EPERMの権限があることを意味します。問題(たとえば、オブジェクトにまったくアクセスできない、またはジョブがルートに制限される)

関連情報