Bug ou Recurso? Grep aceita arquivos como sinalizadores

4

Acabei de me deparar com um cenário estranho, e não tenho certeza se isso é um recurso, e se não, que tipo de implicações de segurança ele representa? Provavelmente nada para o grep, mas para outros utilitários de rastreamento de diretório, potencialmente?

Veja como se reproduzir:

  • touch ./-vR
  • grep hi *

Observe que tudo que não é hi é retornado, recursivamente.

    
por MrDuk 26.06.2017 / 16:27

2 respostas

4

Essa é uma característica conhecida do GNU getopt (usada para análise de opções por ferramentas GNU).

grep hi -vR

é exigido pelo POSIX para procurar hi no arquivo chamado -vR , já que muitas opções não são reconhecidas por argumentos não-opcionais (como hi aqui).

A maioria das ferramentas GNU ou ferramentas que estão sendo usadas ou a API GNU getopt no modo padrão não honram isso a menos que POSIXLY_CORRECT esteja no ambiente.

Então você precisa:

POSIXLY_CORRECT=1 grep hi *

(forçar grep a se comportar de uma maneira compatível com POSIX) ou

grep -- hi *

(marque explicitamente o final das opções com -- ) ou

grep hi ./*

(verifique se todos os nomes de arquivos começam com ./ e, portanto, não - ).

Em qualquer caso, com:

grep -e hi -vR

você teria o problema com o GNU e com o não-GNU grep , já que hi não é um argumento não-opcional, mas um argumento para a opção -e , então você precisaria:

grep -e hi -- *

ou (melhor como também resolve o problema de um arquivo chamado - ):

grep -e hi ./*

(POSIXLY_CORRECT não ajudaria).

    
por 26.06.2017 / 16:32
4

Este é um "recurso" do GNU grep (e outros utilitários GNU que fazem a análise de linha de comando da mesma maneira). As rotinas de análise de linha de comando que o GNU usa permitem que os sinalizadores sejam especificados após o que deveria ser o operando final na linha de comando.

Para contornar isso, diga explicitamente ao utilitário que não haverá mais sinalizadores de linha de comando:

$ grep -- hi *

Isso força grep a tratar os nomes de arquivos expandidos de * pelo shell como nomes de arquivos e não como opções.

    
por 26.06.2017 / 16:32