충분한 권한 없이 실행될 때 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을 반환합니다 .잘못된 호출 또는 권한.


묻다. 그렇다면 이 점에서 왜 iptables그리고 mount다른가요? 순전히특정 애플리케이션? 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, &&, ||, !, set -e, …) make와 모든 표준 유틸리티 에 내장됩니다 . POSIX C 프로그램에서는EXIT_SUCCESS0이고 EXIT_FAILURE0이 아닌 값(보통 1)입니다.

실패 시 종료 코드 선택에 관한 규칙이나 보편적인 규칙은 없습니다. 소수의 POSIX 유틸리티만이 특정 오류 상태 코드를 시행합니다.

  • cmp그리고diff개별 파일의 경우 1을 반환하고 오류 조건의 경우 ≥2를 반환합니다.
  • expr식이 0 또는 null로 평가되면 1을 반환하고, 식이 유효하지 않으면 2를 반환하며, 기타 오류에서는 ≥3을 반환합니다.
  • grep"찾을 수 없음"인 경우 1을 반환하고 오류 조건인 경우 ≥2를 반환합니다. 많은 검색 명령이 이를 따릅니다(그러나 find일치하는 파일이 없으면 0을 반환하지 않음).
  • mesg예인 경우 0, 아니요인 경우 1, 오류인 경우 ≥2를 반환합니다.
  • patch블록이 거부되면 1을 반환하고, 기타 오류의 경우 ≥2를 반환합니다.
  • sort -c파일 데이터가 정렬되지 않은 경우 1을 반환하고 오류가 있는 경우 ≥2를 반환합니다.
  • compress그리고localedef특정 오류에 대해 작은 값을 정의하십시오.

더 큰 값이 더 심각한 실패를 의미한다는 공통된 믿음이 있지만 보편적이지는 않습니다. grep(이 패턴이 존재합니까?) 및 diff(이 파일이 동일합니까) 와 같은 부울 조건을 테스트하는 명령의 경우 1은 "아니요"를 의미하고 값이 높을수록 오류를 나타냅니다. 또한 126에서 시작하는 값은 셸에 구워지기 때문에 거의 사용되지 않습니다( , 및 command) env. nice126 및 127은 외부 명령 호출이 실패했음을 나타내고 128 이상의 값은 명령이 종료되었음을 나타냅니다. 신호로.nohuptime$?/usr/include/sysexits.hsendmail에서 왔기 때문에 이메일 시스템, 특히 procmail과 같은 메일 전달 에이전트에서만 본 적이 있습니다.

많은 프로그램은 항상 1을 반환하거나 실패 시 항상 2를 반환합니다. iptables몇 가지 다른 오류 코드를 정의 하는 경우가 있습니다 .

표시된 반환 값 strace은 다음과 같습니다.시스템 호출. 시스템 호출은 오류를 나타내기 위해 -1을 반환하고 오류 코드를 다음 위치에 저장합니다.errno바꾸다. Strace는 errno반환 코드 뒤의 괄호 안에 값을 표시합니다. EACCES("권한이 거부됨")과 ("작업이 허용되지 않음")의 차이점은 EPERM약간 미묘합니다. EACCES이는 대상 개체에 대한 권한이 작업을 허용하지 않는다는 것을 의미하는 반면 EPERM다른 권한이 있음을 의미한다는 것 입니다. 문제(예: 개체에 전혀 액세스할 수 없거나 작업이 루트로 제한됨)

관련 정보