Não é uma ótima solução, mas:
- torna o diretório só gravável por você ou algum usuário designado ou pseudo-usuário, ou, melhor ainda, um grupo (de que seus usuários não são membros),
- escreva cuidadosamente um wrapper para
mkdir
e instale-o como setuid ou setgid.
- Se você escolher a opção group / setgid, pode ser tão simples quanto
mkdir("root_scripts/<user's folder name>", 0755);
E, se você não se importa em fazer a pasta de propriedade do usuário quem criou, é tudo que você precisa fazer se o programa for setuid. Caso contrário, - Se você fizer o programa setuid root, seja muito com muito cuidado
fazer um milhão de cheques para uso inadequado e, em seguida,
mkdir("root_scripts/<user's folder name>", 0755); chown("root_scripts/<user's folder name>", <user's uid>, <user's gid>);
- Se você fizer o programa setuid para um usuário não-root,
criar um subdiretório gravável pelo mundo em (ou em algum lugar abaixo)
o seu diretório
root_scripts
, e faça algo comoeuid = geteuid(); ruid = getruid(); seteuid(ruid); // Person who's running the program mkdir("root_scripts/.writable_subdir/<user's folder name>", 0755); seteuid(euid); // Owner of the program and the top-level directory rename("root_scripts/.writable_subdir/<user's folder name>, "root_scripts/<user's folder name>");