3

これまでプログラミングしたことはありませんが、仕事用に非常に単純な webapp を作成する必要がありました。

このdigクエリを機能させようとしています:

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

このちょっとした perl を使って:

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

dig の最後に「any」を認識していないようで、次のようになります。

sh: line 1: any: command not found

私が間違ってやっている愚かな単純なことは何ですか?

4

3 に答える 3

11

改行$queryが含まれているため、シェルanyは新しいコマンドとして認識されます。

chomp $query;システムコールの前に実行して、改行を削除してみてください。chompの詳細。

于 2009-12-05T05:34:02.300 に答える
2

dig ... '$query'シェルがそれを見たときに単一引用符で囲まれるように、おそらく使用する必要があります。そうしないと、シェルはすべてのメタ文字を解釈します。誰かが "; echo my_key > ~/.ssh/authorized_keys"あなたの Web フォームに入力した場合、あなたは失敗します。内部使用のみの場合でも、誰かがクエリにスペースを含むものを入力した場合に壊れたくありません (シェルは単語を分割し、2 つの引数として dig に渡します)。

あなたはパールを使うことができます

\Q$クエリ\E
$query を展開し、潜在的なメタ文字 \escaped を常に使用します。実際には、単一引用符を追加するよりもはるかに優れています。クエリに単一引用符が含まれていると、引用符が壊れます。とにかく攻撃しやすい。これはあなたの記憶にそれを修正するはずです。

Perl には、system() 関数を使用して引数を文字列のリストとして指定する安全な方法があり、1 つの文字列をシェル コマンドとして評価するのではなく、/bin/sh を使用しません。これが最も安全な方法ですが、pipe && fork && exec を自分で実行しない限り、バックティック バージョンはありません。

于 2009-12-05T06:55:36.160 に答える
1

ほとんどの場合、コマンド文字列を壊しているのは $query 変数にあるものです。失敗してエラーが発生する例を教えてください。または、スクリプトをもう少し表示しますか?

于 2009-12-05T05:35:52.653 に答える