O exec()
do PHP executa o comando através de um shell, portanto, mesmo antes de seu script ser executado, há um shell que processa a linha de comando. $$
no shell é uma variável especial para o ID do processo do shell, mas você obteria o mesmo para qualquer outra coisa que parecesse ser uma variável.
O manual do PHP para exec
explicitamente lembra de citar o comando ou os argumentos para processamento de shell :
Warning
When allowing user-supplied data to be passed to this function, use escapeshellarg() or escapeshellcmd() to ensure that users cannot trick the system into executing arbitrary commands.
Não consigo encontrar uma versão de system()
/ exec()
/ outros que permita executar um comando diretamente (como a versão multi-argumento de system()
/ exec()
em Perl), para que possa ser que a única opção é usar escapeshellarg()
. Ele cita o argumento com aspas simples e manipula aspas simples também.
$ php -r '$foo="$$$"; system("/bin/echo $foo");'
21836$
$ php -r '$foo="$$$"; system("/bin/echo " . escapeshellarg($foo));'
$$$
(Você poderia usar escapeshellcmd()
para citar todo o script, mas eu evitaria situações em que isso é necessário: a linguagem shell é complexa o suficiente para que haja uma boa chance de a cotação falhar em algum caso obscuro.)
Além disso, como Kusalananda menciona, (e como de costume) você ainda quer citar as variáveis em seu script Bash também. Portanto, use echo "$path"
em vez de echo $path
. O cifrão não é um problema aqui, os espaços em branco e glob são.
Veja:
- Divisão de palavras na wiki de Greg e
- Quando é necessário fazer uma cotação dupla?