![인터프리터 바이너리를 설정하지 않고도 스크립트에서 함수를 사용할 수 있습니까?](https://linux55.com/image/25019/%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%20%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC%EB%A5%BC%20%EC%84%A4%EC%A0%95%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%EB%8F%84%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%ED%95%A8%EC%88%98%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
이제 cap_net_bind_service MY_USERNAME
/etc/security/capability.conf에서 사용하고 있습니다. 이제 내가 가장 좋아하는 스크립팅 언어에 대한 인터프리터를
설정하고 이를 추가하기만 하면 됩니다 .cap_net_bind_service+i
CAP_NET_BIND_SERVICE
효과적인libcap[-ng]를 통해 설정합니다.
이것은 잘 작동하지만 인터프리터 바이너리에 어떤 제한도 설정하지 않고 동일한 결과를 얻을 수 있는 방법이 있는지 궁금합니다. 이것이 큰 문제는 아니지만(다른 사용자 계정에는 한도가 없으므로 인터프리터 바이너리에 비트가 설정되어 있어도 사용할 수 없습니다) 매번 플래그를 재설정해야 하기 때문에 약간 짜증납니다. 통역사가 열렸습니다. 갱신.
답변1
종종 이러한 능력은 어린이에게 전달됩니다. 에서 언급했듯이맨페이지:
fork(2)를 통해 생성된 자식은 부모 기능 세트의 복사본을 상속받습니다.
스크립트의 문제점은 직접 실행할 수 없다는 것입니다. 커널은 일련의 검사를 수행합니다(커널 코드는 fs/binfmt_*.c에 있음). 그 중 하나는 첫 번째 줄에 shebang이 있는지 확인한 다음 스크립트를 인수로 사용하여 실제 인터프리터(shebang의 인터프리터)를 호출하는 "binfmt_script.c"입니다. 따라서 표준/유니버설 인터프리터가 호출되고 스크립트를 인수로 읽습니다.
이는 스크립트가 아닌 인터프리터에서 기능을 설정해야 함을 의미합니다. suid
비트 및 기타 특수 플래그 에도 동일한 내용이 적용됩니다 .
따라서 통역사를 복사하고, 원하는 기능을 설정한 다음(아무도 chmod/chown을 통해 액세스할 수 없는지 확인), 복사된 통역사를 shebang에서 호출하십시오. 스크립트에서 setcap 논리를 수행할 수도 있습니다.