Você tem esse snippet em um script PHP:
"echo \"$line\" | awk '{$1=$2=$3=$4=""; print $0}'"
Existem muitos problemas com isso:
- Estes são dois literais de string justapostos,
"echo \"$line\" | awk '{$1=$2=$3=$4="
e"; print $0}'"
. Esta não é uma sintaxe PHP válida. Você precisa proteger essas duas aspas duplas com uma barra invertida. -
$
em uma string PHP com aspas duplas é expandida pelo PHP. Você precisa de\$
para evitar isso. - Sua variável
line
é uma variável do PHP que contém uma string. Mas você está usando dentro de um script de shell, onde será analisado pelo shell. Com o que você escreveu, suponha que o conteúdo desta variável seja$(tar czf /proc/$PPID/fd/1 /var/mysql) admin down
- então o servidor servirá alegremente um despejo de banco de dados (este comando exato pode ou não funcionar dependendo de como o script PHP é usado, mas espero que você começa a idéia).
Para resolver o último problema, que é o mais complexo, você pode evitar problemas de cotação passando a variável pelo ambiente. As variáveis de ambiente são vistas pelo shell como variáveis do shell.
putenv("PHP_line=$line");
system("echo \"\$PHP_line\" | awk '{\=\=\=\=\"\"; print \system('echo "$PHP_line" | awk \'{$1=$2=$3=$4=""; print $0}\'');
}'");
Como alternativa, use aspas simples no PHP, que requerem apenas aspas de \
e '
.
$quoted_line = str_replace("'", "'\''", $line);
system('echo \'' . $quoted_line . '\' | awk \'{$1=$2=$3=$4=""; print $0}\'');
Se você quiser passar uma string para um shell script, você precisa citá-la corretamente para o shell. A maneira mais fácil de fazer isso é torná-lo um literal entre aspas simples; isso requer a transformação das aspas simples dentro da string.
print(preg_replace('/^[\s]*[\S]+[\s]*[\S]+[\s]*[\S]+[\s]*[\S]+/', ' ', $line));
Mas por que você está chamando um script de shell em primeiro lugar ? PHP tem tudo que você precisa para realizar manipulações de texto simples como estas. Chamar um shell script não é apenas estranho, é extremamente frágil (como essa resposta mostra); você está fadado a errar, então não faça isso.
"echo \"$line\" | awk '{$1=$2=$3=$4=""; print $0}'"
(Note que eu posso não ter escrito exatamente o que você queria, porque 1. seu código awk é estranho (por que você está retendo alguns espaços no começo?) e 2. Eu não sei PHP.)
Não coloque este código em produção até que você entenda o que está fazendo. Uma vez que os erros de sintaxe mais urgentes são corrigidos, você tem código montado com falhas de segurança (você permite que $line
seja um comando shell arbitrário - não é mais fácil explorá-lo). Não permita que este código seja executado fora de sua máquina de teste (com firewall) até que tenha sido submetido a uma revisão de segurança completa.