Por que meus backticks do Perl reclamam "sh: linha 1: houver: comando não encontrado"?
Pergunta
Eu nunca programei antes, mas precisava escrever um webApp muito simples para o trabalho.
Estou tentando fazer com que essa consulta de escavação funcione:
dig @8.8.8.8 +nocomments +nostats +noquestion +nocmd google.com any
Com este pedaço de Perl:
$dig = `/usr/bin/dig \@8.8.8.8 +nocomments +nostats +noquestion +nocmd $query any`;
Exceto que não parece reconhecer "qualquer" no final de Dig e me dá:
sh: line 1: any: command not found
Que coisa estupidamente simples estou fazendo incorretamente?
Solução
eu aposto $query
tem uma nova linha, fazendo com que seu shell veja any
como um novo comando.
Tente fazer chomp $query;
Antes de seu sistema ligar para remover a nova linha. Mais sobre chomp.
Outras dicas
Você provavelmente deveria usar dig ... '$query'
Portanto, é citado quando o shell o vê. Se você não fizer isso, o shell interpretará qualquer metacaracter. Se alguém colocar "; echo my_key > ~/.ssh/authorized_keys"
No seu formulário da web, então você está ferrado. Mesmo que seja apenas para uso interno, você não deseja que ele quebre se alguém colocar algo com espaços na consulta (que o shell irá dividir e passar para cavar como dois args.)
Você pode usar o Perl's
\Q$query\EPara expandir o $ Query com o Metacharacter sempre potencial escapado. Na verdade, isso é muito melhor do que adicionar cotações únicas, se a consulta contiver um caractere de uma única citação, ela sairá das citações. Ainda super fácil de atacar. este deve consertar isso em sua memória.
O Perl possui maneiras seguras de usar a função System () para especificar o ARGS como uma lista de strings, evitando /bin /sh, em vez de uma string a ser avaliada como um comando shell. Esta é a maneira mais segura, mas não há uma versão de volta sem fazer o Pipe && Fork && Exec.
Provavelmente, é algo que está na variável $ consulta que está quebrando a sequência de comando. Você pode nos dar um exemplo em que está falhando e dando o erro? Ou mostrar um pouco mais do seu script?