Por que meus backticks do Perl reclamam "sh: linha 1: houver: comando não encontrado"?

StackOverflow https://stackoverflow.com/questions/1851213

  •  13-09-2019
  •  | 
  •  

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?

Foi útil?

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\E
Para 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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top