Parece que você está tentando resolver um problema usando ferramentas que não permitem fazer o que você deseja. Se você depender de permissões de ACLs ou Unix, as permissões referentes ao diretório dependerão do usuário que está tentando alterá-las. Portanto, independentemente de como você o corta, se um usuário puder gravar no diretório, ele poderá criar arquivos além daqueles que você deseja criar.
No entanto, se o usuário não puder gravar no diretório, mas desejar que um script seja capaz, você deverá executar esse script como um usuário que possa. Isso pode ser feito de duas maneiras, se você deve usar um script, então, como mencionado pelo @Wissam Al-Roujoulah, você pode usar o sudo. Se você puder obter o comportamento pretendido em um binário, em vez de um script, poderá usar setuid nele e configurá-lo para que qualquer membro de um grupo possa executar o binário, mas esse binário será executado como um usuário diferente.
O problema com o sudo nos scripts é o mesmo que o motivo pelo qual você não pode usar o setuid em um script. É simplesmente fácil demais para alguém perverter o comportamento de um script, usando variáveis de shell, portanto, aja com cautela.
Eu resolvi minha própria versão do seu problema escrevendo um arquivo .c bem básico que executa comandos do sistema como um script, depois o binário compilado, setuid para permitir que os usuários o usem. No meu caso, eu queria limpar as pastas de cache de vários locais, onde as necessidades binárias eram executadas como root, mas queria que os usuários não privilegiados pudessem executá-las.
Recortei bastante o arquivo, já que minhas opções originais incluíam a limpeza de vários tipos diferentes de cache, em locais diferentes, mas você teve a ideia. Eu também incluí o código que eu usei para auditar o log, pois ele mostra como colocar informações no syslog, se você quiser usar isso em vez de um arquivo.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <syslog.h>
int has_root_euid()
{
if (geteuid()==0) {
return 1;
}
return 0;
}
int main (int argc, char * argv[])
{
int retval;
uid_t uid;
uid = getuid();
openlog (argv[0], LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
syslog (LOG_NOTICE, "UID %d ran clearcache", uid);
closelog();
if (!has_root_euid()) {
printf("Insufficient permissions to clear WSDL cache.\n");
} else {
printf("Clearing WSDL cache: rm -f /tmp/wsdl*\n");
setuid(0);
retval = system("rm -f /tmp/wsdl*");
setuid(uid);
printf("System returns (%d). \n", retval);
}
return 0;
}