2017-10-03 11 views
1

私はストレステストにFTPを介してファイルをアップロードする.NETアプリケーションの機能を試しています。この関数は、.NETの組み込みのFtpWebResponseクラスを使用します(ユーザーのサーバーがSSH接続をサポートしていない場合に備えて)。次のコードを使用して、ユーザーのディレクトリのUbuntuサーバーに"test up1/archive: * OR | or $ or <and>."ディレクトリを作成します。FtpWebResponseは、WebRequestMethods.Ftp.MakeDirectoryメソッドのディレクトリをUbuntuサーバーの特定のディレクトリ名のために作成できません。

私は "archive: * OR | or $ or <and>."ディレクトリを作成しようとすると
//First call succeeds 
string strPath = "ftp://webhost.com/%2F/UserDir/" + 
    Uri.EscapeDataString("test up1") + "/"; 
createDirViaFTP(strPath); 

//but then this call fails 
strPath += Uri.EscapeDataString("archive: * OR | or $ or <and>.") + "/"; 
createDirViaFTP(strPath); 


static bool createDirViaFTP(string strURI) 
{ 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(strURI); 
    request.EnableSsl = bUseSsl; //can be either false or true 
    request.Credentials = = new NetworkCredential(strUsrName, secUsrPwd); 
    request.UseBinary = true; 
    request.Timeout = -1; 

    request.Method = WebRequestMethods.Ftp.MakeDirectory; 

    try 
    { 
     using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) 
     { 
      if (response.StatusCode == FtpStatusCode.PathnameCreated) 
      { 
       //Created OK 
       return true; 
      } 
     } 
    } 
    catch(Exception ex) 
    { 
     //Failed 
     Console.WriteLine("EXCEPTION: Path=" + strURI + "\n" + ex.Message); 
    } 

    return false; 
} 

createDirViaFTPへの2回目の呼び出しは、次の例外がスローされます。

EXCEPTION: Path=ftp://webhost.com/%2F/UserDir/test%20up1/archive%3A%20*%20OR%20%7C%20or%20%24%20or%20%3C%20and%20%3E./ 
The remote server returned an error: (550) File unavailable (e.g., file not found, no access). 

しかし、なぜ?私はここで間違って何をしていますか? 2番目のディレクトリ名にあるこれらのシンボルはすべて、合法的なLinuxファイル名でなければなりません。 SSHシェルで同じディレクトリを作成できます。

+0

サーバー上の任意のFTPクライアントを使用して、このような名前のフォルダを作成できますか? –

答えて

1

* nix ProFTPD FTPサーバーでこのようなフォルダを作成することはできますが、そのようなフォルダをシェルの同じシステムに作成することはできます。 FTPで

、私は

550アーカイブを取得:* OR | $または<と>:無効なディレクトリ名

これはおそらくFtpWebRequestのものです。それは盲目的に550エラーを"File unavailable"に翻訳するだけです。

私はそれがあなたのコードの問題ではないと思っていますが、ファイル/ディレクトリ名に対するFTPサーバの制限です。

特に、ProFTPDはディレクトリ名でアスタリスクを無条件に禁止します。

core_mkd functionを参照してください:確かに

MODRET core_mkd(cmd_rec *cmd) { 
    int res; 
    char *decoded_path, *dir; 

    CHECK_CMD_MIN_ARGS(cmd, 2); 

    /* XXX Why is there a check to prevent the creation of any directory 
    * name containing an asterisk? 
    */ 
    if (strchr(cmd->arg, '*')) { 
    pr_response_add_err(R_550, _("%s: Invalid directory name"), cmd->arg); 

    pr_cmd_set_errno(cmd, EINVAL); 
    errno = EINVAL; 
    return PR_ERROR(cmd); 
    } 
    ... 

そして、私はディレクトリ名から*を削除する場合は、作成が成功します。だから私はあなたのテストにもProFTPD FTPサーバーを使用すると思います。

+0

ええ、私は似たような経験がありました。私は1台のサーバーで試してみましたが、失敗しました。しかし、その後別の仕事。だから、サーバ側に何かがあるはずです。 (私は共有Webホスティングを使用していますので、詳細を調査するためにサーバーに完全にアクセスすることはできません)。興味深いことに、SSHまたはSFTP経由で行うことはうまくいくようです。私はSSH.NETライブラリを使用しています。したがって、問題はサーバー側のFTPハンドラーになければなりません。しかし、ちょうど推測... – c00000fd

+0

うーん...ちょうどあなたの編集を見た。うん、それはアスタリスクかもしれない。 – c00000fd

関連する問題