Почему мои Perl жалуются на «sh: line 1: any: команда не найдена»? - PullRequest
3 голосов
/ 05 декабря 2009

Я никогда не программировал раньше, но мне нужно было написать очень простое веб-приложение для работы.

Я пытаюсь заставить этот запрос копать работать:

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`;

За исключением того, что он, кажется, не распознает "any" в конце раскопок и дает мне:

sh: line 1: any: command not found

Какую глупую простую вещь я делаю неправильно?

Ответы [ 3 ]

11 голосов
/ 05 декабря 2009

Бьюсь об заклад, $query содержит новую строку, в результате чего ваша оболочка видит any в качестве новой команды.

Попробуйте выполнить chomp $query; перед вашим системным вызовом, чтобы удалить символ новой строки. Подробнее о chomp .

2 голосов
/ 05 декабря 2009

Вероятно, вам следует использовать dig ... '$query', поэтому он будет заключен в одинарные кавычки, когда оболочка его увидит. Если вы этого не сделаете, оболочка будет интерпретировать любые метасимволы. Если кто-то вставит "; echo my_key > ~/.ssh/authorized_keys" в вашу веб-форму, значит, вы облажались. Даже если он предназначен только для внутреннего использования, вы не захотите, чтобы он сломался, если кто-то вставит в запрос что-то с пробелами (которые оболочка разделит на слова и передаст в dig как два аргумента).

Вы можете использовать perl's

\Q$query\E
, чтобы расширить $ query с помощью потенциального метасимвола \ escape. На самом деле, это гораздо лучше, чем добавлять одинарные кавычки, если запрос содержит символ одинарных кавычек, он выйдет из кавычек. По-прежнему супер-легко атаковать. Это должно исправить это в вашей памяти .

В Perl есть безопасные способы использовать функцию system () для указания аргументов в виде списка строк, избегая / bin / sh, а не одной строки, которая будет оцениваться как команда оболочки. Это самый безопасный способ, но нет версии с обратной галочкой, если вы не выполните конвейер && fork && exec самостоятельно.

1 голос
/ 05 декабря 2009

Скорее всего, это то, что находится в переменной $ query и нарушает командную строку. Можете ли вы дать нам пример, где он терпит неудачу и дает ошибку? Или показать немного больше вашего сценария?

...