Почему моя программа Perl CGI возвращает ошибку сервера?

Недавно я начал изучать cgi и настроил сервер Ubuntu в vbox. Первая программа, которую я написал, была на Python с использованием vim через ssh. Затем я установил Eclipse на свою станцию ​​с Windows 7 и создал точно такой же файл Perl; просто привет мир.

Я попытался запустить его и получил 500 баллов, в то время как код Python в том же каталоге (/ usr / lib / cgi-bin) отображался нормально. Разочарованный, я проверил и трижды перепроверил разрешения, начиная с #! / Usr / bin / perl. Я также проверил, установлен ли AddHandler в .pl. Все было настроено нормально, и по прихоти я решил написать такой же точный код на сервере, используя vim, как я сделал с файлом Python.

О чудо, это сработало. Я сравнил их, думая, что сошел с ума, и они абсолютно такие же. Итак, в чем дело? Почему файл, созданный в Windows 7 в Eclipse, отличается от файла, созданного на сервере Ubuntu с помощью vim? У них разные двоичные заголовки или что-то в этом роде? Это действительно может повлиять на мою среду разработки.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Testing.";

Журнал ошибок Apache:

[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] (2)No such file or directory:     exec of '/usr/lib/cgi-bin/test.pl' failed
[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] Premature end of script headers: test.pl
[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] File does not exist: /var/www/favicon.ico

Это постоянная ошибка, которую я получаю.


person jeffberhow    schedule 07.08.2012    source источник
comment
Что показывают журналы apache?   -  person matthias krull    schedule 07.08.2012
comment
Первое правило отладки CGI состоит в том, что если вы получаете 500, вы смотрите в журналы сервера. Второе правило заключается в том, что если что-то идет не так, вы запускаете его из командной строки на том же компьютере, чтобы увидеть, что он выводит.   -  person Quentin    schedule 07.08.2012
comment
Я бы поставил деньги на то, чтобы это было \ r \ n на #! строка вместо \ n   -  person Flexo    schedule 07.08.2012
comment
Кроме того, заголовок Content-Type: должен иметь в конце \ r \ n \ r \ n.   -  person tripleee    schedule 07.08.2012
comment
@ikegami - разве OP не подразумевает, что на сервере работает Ubuntu?   -  person Flexo    schedule 07.08.2012
comment
@Flexo, о да, я неправильно понял. Он редактировал в Windows, но обе среды являются средами unix. Ваша гипотеза, скорее всего, верна. Сделайте ответ! Удаление моих предыдущих комментариев.   -  person ikegami    schedule 07.08.2012
comment
@tripleee, apache отлично справляется с LF; он отправляет CR LF клиенту. [Это репост предыдущего комментария с удаленными нерелевантными частями]   -  person ikegami    schedule 07.08.2012
comment
Я обновил исходный пост с журналом Apache. Файл очень существует и имеет соответствующие разрешения. Единственная разница между этим файлом и тем, который работает должным образом, заключается в том, в какой ОС и в какой среде они были созданы.   -  person jeffberhow    schedule 07.08.2012


Ответы (3)


Я думаю, у вас есть несколько ложных символов \r в первой строке вашего Perl-скрипта, когда вы пишете его в Windows.

Например, я создал в Windows следующий файл:

#!/usr/bin/perl

code goes here

При просмотре с помощью hexdump он показывает:

00000000  23 21 2f 75 73 72 2f 62  69 6e 2f 70 65 72 6c 0d  |#!/usr/bin/perl.|
00000010  0a 0d 0a 63 6f 64 65 20  67 6f 65 73 20 68 65 72  |...code goes her|
00000020  65 0d 0a                                          |e..|
00000023

Обратите внимание на 0d - \r, которые я здесь выделил. Если я попытаюсь запустить это с помощью ./test.pl, я получу:

zsh: ./test.pl: bad interpreter: /usr/bin/perl^M: no such file or directory

А если я напишу тот же код в Vim на машине UNIX, я получу:

00000000  23 21 2f 75 73 72 2f 62  69 6e 2f 70 65 72 6c 0a  |#!/usr/bin/perl.|
00000010  0a 63 6f 64 65 20 67 6f  65 73 20 68 65 72 65 0a  |.code goes here.|
00000020

Вы можете исправить это одним из нескольких способов:

  1. Вы, вероятно, можете сохранить в своем редакторе «окончания строк UNIX» или что-то подобное.
  2. Вы можете запустить dos2unix или аналогичный для файла после его сохранения
  3. Вы можете использовать sed: sed -e 's/\r//g' или аналогичный.

Ваши журналы apache должны иметь возможность подтвердить это (если они немного не увеличивают ведение журнала на вашем сервере разработки).

person Flexo    schedule 07.08.2012
comment
Это оно. Спасибо, что выполнили эти тесты для меня. Я очень ценю ваше время и ответ. - person jeffberhow; 07.08.2012
comment
Спасибо, очень хорошо объяснено .. Мне потребовались часы, чтобы добраться сюда и найти ваше решение !! - person Govind Kailas; 07.07.2014

Конечно, может.

  • В одной среде может быть установлен модуль, а в другой - нет.
  • Perl может быть установлен в разных местах в двух средах.
  • В средах могут быть разные версии Perl.
  • В средах могут быть разные операционные системы.
  • Разрешения могут быть настроены неправильно в одной из сред.
  • так далее

Но вместо того, чтобы так дико спекулировать, почему бы вам не проверить журнал ошибок, чтобы узнать, какую ошибку вы действительно получили?

person ikegami    schedule 07.08.2012

Нет, это просто текстовые файлы. Конечно, можно легко писать непереносимые программы, используя system() или другие подобные службы, которые зависят от среды.

person tripleee    schedule 07.08.2012