FtpWebResponse не может создать каталог для метода WebRequestMethods.Ftp.MakeDirectory для определенного имени каталога на сервере Ubuntu

Я пытаюсь провести стресс-тестирование функции моего приложения.NET, которая загружает файлы по протоколу FTP. Эта функция использует встроенный.NET FtpWebResponse класс (в случае, если сервер пользователя не поддерживает соединение SSH.) Я использую следующий код, чтобы попытаться создать "test up1/archive: * OR | or $ or < and >." каталог на сервере Ubuntu в каталоге моего пользователя:

//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 выдает следующее исключение при попытке создать "archive: * OR | or $ or < and >." реж:

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).

Но почему? Что я здесь не так делаю? Все эти символы во втором имени каталога должны быть допустимыми именами файлов Linux. Я могу создать тот же каталог через оболочку SSH.

1 ответ

Решение

Я не могу создать такую ​​папку на FTP-сервере *nix ProFTPD, хотя я могу создать такую ​​же папку в той же системе в оболочке.

В FTP я получаю

550 архив: * ИЛИ | или $ или <и>.: неверное имя каталога

И это, вероятно, что FtpWebRequest получает тоже. Он просто вслепую переводит любую ошибку 550 в "Файл недоступен".

Поэтому я не думаю, что это проблема вашего кода, а скорее ограничение FTP-сервера на имена файлов / каталогов.

Примечательно, что ProFTPD безоговорочно запрещает звездочку в именах каталогов.

Увидеть core_mkd функция:

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);
  }
  ...

И действительно, если я удалю * от имени каталога, создание успешно. Поэтому я предполагаю, что вы также используете FTP-сервер ProFTPD для своих тестов.

Другие вопросы по тегам