Perché il mio backticks Perl lamentano “sh: Linea 1: qualsiasi: comando non trovato”?
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?
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\Eper 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?