Bash - variável contém cifrões

0

Eu tenho um script php que transmite uma variável para um script bash:

exec("bash.sh $path")

O script bash parece assim:

#!/bin/bash
path=$1

echo $path

Se o caminho terminar em cifrões da seguinte forma: myfile.$$$

A saída é: myfile.32577$

Como posso escapar dos dólares na variável, para que o eco seja preciso?

    
por Lee 09.07.2018 / 11:27

2 respostas

4

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:

por 09.07.2018 / 11:48
0

Caso este recurso exec no php seja implementado via sh -c cmd , você precisa chamar:

 exec("bash.sh '$path'")

dentro do seu shell script, não parece haver um problema, já que $$ só seria expandido se você usasse eval .

    
por 09.07.2018 / 12:33