인터프리터 바이너리를 설정하지 않고도 스크립트에서 함수를 사용할 수 있습니까?

인터프리터 바이너리를 설정하지 않고도 스크립트에서 함수를 사용할 수 있습니까?

이제 cap_net_bind_service MY_USERNAME/etc/security/capability.conf에서 사용하고 있습니다. 이제 내가 가장 좋아하는 스크립팅 언어에 대한 인터프리터를
설정하고 이를 추가하기만 하면 됩니다 .cap_net_bind_service+iCAP_NET_BIND_SERVICE효과적인libcap[-ng]를 통해 설정합니다.

이것은 잘 작동하지만 인터프리터 바이너리에 어떤 제한도 설정하지 않고 동일한 결과를 얻을 수 있는 방법이 있는지 궁금합니다. 이것이 큰 문제는 아니지만(다른 사용자 계정에는 한도가 없으므로 인터프리터 바이너리에 비트가 설정되어 있어도 사용할 수 없습니다) 매번 플래그를 재설정해야 하기 때문에 약간 짜증납니다. 통역사가 열렸습니다. 갱신.

답변1

종종 이러한 능력은 어린이에게 전달됩니다. 에서 언급했듯이맨페이지:

fork(2)를 통해 생성된 자식은 부모 기능 세트의 복사본을 상속받습니다.

스크립트의 문제점은 직접 실행할 수 없다는 것입니다. 커널은 일련의 검사를 수행합니다(커널 코드는 fs/binfmt_*.c에 있음). 그 중 하나는 첫 번째 줄에 shebang이 있는지 확인한 다음 스크립트를 인수로 사용하여 실제 인터프리터(shebang의 인터프리터)를 호출하는 "binfmt_script.c"입니다. 따라서 표준/유니버설 인터프리터가 호출되고 스크립트를 인수로 읽습니다.

이는 스크립트가 아닌 인터프리터에서 기능을 설정해야 함을 의미합니다. suid비트 및 기타 특수 플래그 에도 동일한 내용이 적용됩니다 .

따라서 통역사를 복사하고, 원하는 기능을 설정한 다음(아무도 chmod/chown을 통해 액세스할 수 없는지 확인), 복사된 통역사를 shebang에서 호출하십시오. 스크립트에서 setcap 논리를 수행할 수도 있습니다.

관련 정보