Olhando o código-fonte da implementação do Linux sysvinit, ele executa um shell quando vê caracteres especiais do shell, mas adiciona exec
antes da string, o que torna possível colocar redirecionamentos e usar caracteres especiais em argumentos, mas não para definir uma variável de ambiente dessa maneira.
} else if (strpbrk(proc, "~'!$^&*()=|\{}[];\"'<>?")) { /* See if we need to fire off a shell for this command */ /* Give command line to shell */ args[1] = SHELL; args[2] = "-c"; strcpy(buf, "exec "); strncat(buf, proc, sizeof(buf) - strlen(buf) - 1); args[3] = buf; args[4] = NULL;
Uma solução simples seria executar env
.
scpt:234:once:env RSYNC_OPTIONS=-q /path/to/script/script.sh arg1 arg2 arg3 2>&1
Algumas soluções possíveis para ilustrar como executar um comando arbitrário:
scpt:234:once:>&1; RSYNC_OPTIONS=-q exec /path/to/script/script.sh arg1 arg2 arg3 2>&1
scpt:234:once:2>&1; RSYNC_OPTIONS=-q exec /path/to/script/script.sh arg1 arg2 arg3