Perché il mio backticks Perl lamentano “sh: Linea 1: qualsiasi: comando non trovato”?

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

  •  13-09-2019
  •  | 
  •  

Domanda

Non ho mai programmato prima, ma il bisogno di scrivere una semplice webapp per il lavoro.

Sto cercando di ottenere questa query scavo al lavoro:

dig @8.8.8.8 +nocomments +nostats +noquestion +nocmd google.com any

Con questo po 'di perl:

$dig = `/usr/bin/dig \@8.8.8.8 +nocomments +nostats +noquestion +nocmd $query any`;

Solo che non sembra riconoscere "qualsiasi" alla fine di scavo e mi dà:

sh: line 1: any: command not found

Che cosa stupidamente semplice sto facendo in modo errato?

È stato utile?

Soluzione

Scommetto $query ha un ritorno a capo in esso, causando la shell per vedere any come un nuovo comando.

Prova a fare chomp $query; prima della chiamata di sistema per rimuovere il ritorno a capo. Altro su chomp .

Altri suggerimenti

Probabilmente si dovrebbe usare dig ... '$query' quindi è single-citato quando il guscio vede. Se non lo fai, allora la shell interpretare alcun metacaratteri. Se qualcuno mette "; echo my_key > ~/.ssh/authorized_keys" nel vostro modulo web, allora sei fregato. Anche se è solo per uso interno, non si vuole la rottura se qualcuno mette in qualcosa con gli spazi nella query (che la parola-split shell e passare a scavare come due args).

È possibile utilizzare perl di

\Q$query\E
per espandere $ query con sempre potenziale metacarattere \ sfuggito. In realtà, questo è molto meglio di quanto l'aggiunta di virgolette singole, se la query contiene un singolo carattere-citazione, si romperà fuori delle citazioni. Ancora super-facile da attaccare. Questo dovrebbe fissare che nella vostra memoria .

Perl ha modi sicuri per utilizzare la funzione di sistema () per specificare i args come un elenco di stringhe, evitando / bin / sh, piuttosto che una stringa da valutare come comando shell. Questo è il modo più sicuro, ma non c'è nessuna versione di back-tick di che, senza fare il tubo forcella && && exec te stesso.

Molto probabilmente, si tratta di qualcosa che è nella variabile $ query che sta rompendo la stringa di comando. Può farci un esempio in cui si sta fallendo e dando l'errore? O mostrare un po 'più del vostro scritto?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top