2010-12-01 19 views
1

私のサブのためのコード:このサブは、テスト・スクリプトから呼び出されたときに異なる結果

sub put_file 
{ 
    my($host, $placement_directory, $tar_directory, $filename, $user, $pass) = @_; 
    my $ftp = Net::FTP->new($host) or die "cannot connect to localhost"; 

    $ftp->login($user, $pass) or die "cannot log in"; 

    $ftp->cwd($placement_directory); 
    print $tar_directory."/".$filename; 
    $ftp->put("$tar_directory/$filename") or die "cannot put file ", $ftp->message; 

    print "File has been placed \n"; 
} 

ので(つまり、コマンドラインから実行します)同じ設定を使用していますCGIスクリプトと同じものをすべて実行すると、エラーは検出されず、ファイルは正しく配置されます。サブスクリプトがCGIスクリプトから呼び出されると、スクリプトは$ tar_directory "/"。$ filenameを出力しますが、 "ファイルは配置されませんでした。\ n"とftp->メッセージ出力は "ファイルディレクトリを変更できませんでした"それはそれの前にcwd行から来ているようだ。

その他の情報: 同じ結果を持つ複数のユーザーとしてテストスクリプトを実行しようとしました。 私は厳格と警告を使用します。 移動されるtarファイルは、スクリプトによって作成されます。

私はperlを使い慣れているので、私はこれに固執し、Googleの力を使って助けを見つけることができないので、助言が役に立ちます。

+0

あなたのWebサーバーには、$ tar_directoryから読み取る権限がないようです。 – gangabass

+0

特定のディレクトリに対するフォルダのアクセス許可により、すべてのユーザーがそのフォルダから読み取ることができます。上位ディレクトリに権限がないと失敗しますか? – wDroter

+0

上位ディレクトリに十分な権限がないと失敗する可能性があります。 – Sorpigal

答えて

0

まあまあです。あなたのftp-> putは失敗して、ダイを引き起こします。あなたが持っていない限り:

use CGI::Carp qw(carpout fatalsToBrowser); 

あなたのブラウザには死亡メッセージが表示されません。あなたが死んでから、あなたは最終的なprintステートメントも見ません。

ダイの出力をウェブサーバーログで確認するか、 "die"を "print"に変更してください。

+0

私はCGI :: Carp qw(warningsToBrowser fatalsToBrowser)を使用しています。 – wDroter

+0

ええええええ、私はまだput()が失敗していると確信しています。そのダイを印刷物に変えてください。 – jimtut

0

Net::FTPファイルハンドルと同様に、ファイル名からput()ことができます。うまくいけば、問題はあなたの側にある場合

open my $fh, '<', $tar_directory . '/' . $filename or die "Could not open file: $!"; 
$ftp->put($fh, $filename) or die "cannot put file ", $ftp->message; 

が、その後openに障害が発生した場合、あなたはその意志いくつかの種類のエラーメッセージを取得する必要があります何が間違っているか教えてください。問題がリモート側にある場合はputが失敗し、今見ているのと同じことが表示されます。

これはcwdからの成功メッセージのみが、リモート側ですべて正常であり、putはリモートサーバーに到達していないことを示します。