당신은 하나가 있다는 것을 알 수 있습니다auditdistd(8)
FreeBSD에서 사용할 수 있는 데몬. 등과 같은 일부 문서화된 명령줄 매개변수가 있습니다 -c
.-d
여기(링크)).
문서화되지 않은 명령줄 인수를 처리하는 코드를 우연히 발견했을 때, 나는 그것이 어떻게 작동하는지 이해하려고 노력했습니다 proto
.
분명히
proto_exec
실행 시에 호출되어/usr/sbin/auditdistd proto foo bar baz
함수foo bar baz
에 대한 인수로 전달됩니다./* * We are executed from proto to create sandbox. */ if (argc > 1 && strcmp(argv[1], "proto") == 0) { argc -= 2; argv += 2; if (proto_exec(argc, argv) == -1) err(EX_USAGE, "Unable to execute proto"); }
(바라보다
/contrib/openbsm/bin/auditdistd/auditdistd.c:main()
(관련된)자세한 내용은. )proto_exec
기능 은 다음과 같습니다 .int proto_exec(int argc, char *argv[]) { struct proto *proto; int error; if (argc == 0) { errno = EINVAL; return (-1); } TAILQ_FOREACH(proto, &protos, prt_next) { if (strcmp(proto->prt_name, argv[0]) == 0) break; } if (proto == NULL) { errno = EINVAL; return (-1); } if (proto->prt_exec == NULL) { errno = EOPNOTSUPP; return (-1); } error = proto->prt_exec(argc, argv); if (error != 0) { errno = error; return (-1); } /* NOTREACHED */ return (0); }
(바라보다
/contrib/openbsm/bin/auditdistd/proto.c:proto_exec()
(관련된)자세한 내용은. )솔직히 여기서 무슨 일이 일어나고 있는지 이해가 안 돼요.
변수
protos
는 다음과 같이 초기화됩니다.static TAILQ_HEAD(, proto) protos = TAILQ_HEAD_INITIALIZER(protos);
(바라보다
/contrib/openbsm/bin/auditdistd/proto.c
(관련된)자세한 내용은. )/usr/sbin/auditdistd proto foo
호출 되면 다음과 같이 말합니다.auditdistd: 프로토타입을 실행할 수 없습니다: 잘못된 인수
이 옵션이 무엇인지, 어떻게 사용하는지 아시는 분 계신가요?
답변1
Auditdistd는 샌드박스를 사용합니다. 상위 프로세스에서 하위 프로세스로 메모리 누수가 발생하지 않도록 하기 위해 분기(2) 작업을 수행할 뿐만 아니라 auditdistd 바이너리도 실행합니다. 새로 실행된 명령이 하위 프로세스임을 알리기 위해 "proto" 매개변수가 전달됩니다.
답변2
내가 이해하는 바에 따르면 특정 구조를 초기화하는 auditdistd
데 사용됩니다 __attribute__((constructor))
(참조어떻게 작동하나요 __attribute__((constructor))
?자세한 내용은).
결과는 protos
, 및 구조의 TAILQ입니다.tls
uds
tcp
proto
이제 미스터리는 해결되었습니다. protos
이는 proto
이 함수로 초기화된 구조로 구성됩니다 __attribute__((constructor))
.