在没有足够权限的情况下执行时,iptables 会返回 3(而不是 1?)的退出代码是否有特定原因?

3 iptables posix exit-status

我只是忘了使用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] $ <---
Run Code Online (Sandbox Code Playgroud)

我的bash PS1提示符回显了最后一个命令退出状态 ($?)。该iptables 手册页并不是指3返回代码:

各种错误消息被打印为标准错误。退出代码为 0 以确保正常运行。似乎是由无效或滥用命令行参数引起的错误导致退出代码为 2,其他错误导致退出代码为 1。

SUSv3 / POSIX讨论的命令退出状态1诸如mount- 对于错误条件有 7 种不同的退出状态 - 在没有特权的情况下执行的命令返回 1;其联机帮助页中记录的内容:不正确的调用或权限


问: 那么,为什么iptablesmount在这方面有所不同-它是纯粹的专用?为什么strace在前一个输出上执行以下操作:socket(PF_INET, SOCK_RAW, IPPROTO_RAW) = -1 EPERM(不允许操作) - 不应该是 EACCES 吗?为什么跟踪非特权mount调用没有发现类似的错误,这些对退出状态有影响吗?或者 -1 是什么原因导致的失败?那3从哪里来?


1. 还有:GNU Bash ; 更一般地;随机怪异;最近的问题是关于特定应用程序的代码+ 历史/usr/include/sysexits.h等。

Bar*_*mar 5

文档不完整。该代码包含以下内部使用的错误代码列表:

enum xtables_exittype {
    OTHER_PROBLEM = 1,
    PARAMETER_PROBLEM,
    VERSION_PROBLEM,
    RESOURCE_PROBLEM,
    XTF_ONLY_ONCE,
    XTF_NO_INVERT,
    XTF_BAD_VALUE,
    XTF_ONE_ACTION,
};
Run Code Online (Sandbox Code Playgroud)

当它尝试初始化时,它会:

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

xtables_error 打印错误消息并使用给定的退出代码退出。

代码似乎有缺陷,恕我直言,假设这里的失败是由于版本问题,而没有检查errno它实际上是EPERM.