LINUX.ORG.RU

не работает perl скрипт


0

0

root@server:
cgi-bin> cat uploadf.cgi
#!/usr/bin/perl

print "Content-type: text/html\n\n";

$|=1;
use strict;
use CGI qw (param);
use Fcntl;

my $filename;
my $FL;
my $PATH;

$FL = param("uploadfile");

print "<hr>$FL<hr>";

# полный физ. путь к папке для загрузки файлов
# cо слешем / в конце.
# папка должна иметь права доступа "на запись" для всех пользователей.

$PATH = "/var/www/downloads/";

if ($FL)
{
$FL =~ /[\\\/:]([^\\\/:]+)$/;
$filename = $1;
open(DATA, ">".$PATH.$filename);
binmode (DATA);
print DATA while (<$FL>);
close (DATA);
print "<center><h3>Файл успешно загружен !</h3></center>";
}

root@server:
cgi-bin> ./uploadf.cgi
zsh: no such file or directory: ./uploadf.cgi
zsh: exit 127 ./uploadf.cgi

если запускать его через perl -d uploadf.cgi и выполнять построчно, то все нормально проходит до конца (только if пропускается, т.к. условие получается ложно)

если запускать его чере страницу/форму, то Internal Server Error. В логах апача появляется сообщение:
[Thu Jul 21 21:01:30 2005] [error] (2)No such file or directory: exec of /var/www/cgi-bin/uploadf.cgi failed
[Thu Jul 21 21:01:31 2005] [error] [client 83.167.97.134] Premature end of script headers: /var/www/cgi-bin/uploadf.cgi


> Premature end of script headers: /var/www/cgi-bin/uploadf.cgi

эта строчка может значить все что угодно... 

вот те скрипт для подгружения файлов, с условием, что apache настроен так, что не перекодирует данные POST:

#!/usr/bin/perl -w
$basedir = "/usr/home/vovka/public_html/files";
$donepage = "http://www.myserver.ru/~vovka/files";;
use CGI; 
$onnum = 1;
while ($onnum != 9) {
	my $req = new CGI; 
	my $file = $req->param("FILE$onnum"); 
	if ($file ne "") {
		my $fileName = $file; 
		$fileName =~ s!^.*(\\|\/)!!; 
		$newmain = $fileName;
		open (OUTFILE, ">$basedir/$fileName"); 
		while (my $bytesread = read($file, my $buffer, 4096)) { 
			print OUTFILE $buffer; 
		} 
		close (OUTFILE); 
	}
	$onnum++;
}
print "Content-type: text/html\n";
print "Location:$donepage\n\n";

Соответственно указывая число в цикле while ($onnum != 9) можно 
подгружать нужное число файлов при одном POST запросе. html-код формы для скрипта:

<form method="POST" action="/cgi-bin/fup.pl"
ENCTYPE="multipart/form-data">
File 1: <input type="file" name="FILE1">
<br>File 2: <input type="file" name="FILE2">
<br>File 3: <input type="file" name="FILE3">
<br>File 4: <input type="file" name="FILE4">
<br>File 5: <input type="file" name="FILE5">
<br>File 6: <input type="file" name="FILE6">
<br>File 7: <input type="file" name="FILE7">
<br>File 8: <input type="file" name="FILE8">
<br>File 9: <input type="file" name="FILE9">
<br>
<input type="submit" value="Upload!">
</form>

Пакеты вида multipart/form-data описываются rfc1867

vilfred ☆☆
()

>> root@server: >> cgi-bin> ./uploadf.cgi >> zsh: no such file or directory: ./uploadf.cgi >> zsh: exit 127 ./uploadf.cgi не знаю как в таких случаях zsh ругается, но все же проверь - перл у тебя точно находится в /usr/bin/perl ?

sasha999 ★★★★
()

Был у меня геммор с одним серваком подобный твоему.

Пишу скрипт, запускаю в локальной консоли: синтаксис в норме Загружаю на сервак, там через ssh запускаю: тоже порядок Запускаю через браузер: жопа! internal server error

и лог Premature end of script headers: без объяснения причин.

Спас следующий алгоритм

1. Создаю файл скрипта на серваке с помощью vim и ssh (пустой или и первой строчкой #!/usr/bin/perl или что там у тебя) 2. Закачиваю его на локаль и правлю как надо 3. Отсылаю после правки обратно. 4. Запускаю через браузер - работает(мистика :-))

Вот собственно такой у меня есть опыт. Как гворится, "чем богаты".

В причинах я не разбирался: мож proftp у них так заточен, а мож у меня клиент, а мож ещё чего...

r_asian ★☆☆
()

Обычно это означает что в скрипте в первой строчке написано
не '#!/usr/bin/perl\n' а '#!/usr/bin/perl\r\n' (переход
каретки виндовый), соответственно bash и zsh ищут интерпретатор
/usr/bin/perl\r и разумеется его не находят... проверяется
побайтовым выводом. Лечится... Хм хз как лечится, не помню
как вим завставить это вылечить - уж больно он умный. mcedit
не умный позволяет "как есть" удалять эти символы...
можно ещё самим перлом:
cat .... | perl -e 'while(<>) {s/\r//g;print $_}' > newfile.pl

Ещё тупой вопрос: chmod 755 ... сделал?

vahvarh ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.