FTP-функции PHP не будут использовать абсолютные пути

Цель состоит в том, чтобы использовать php для FTP на сервере и получить списки каталогов. Единственная проблема в том, что мне нужно использовать абсолютный путь, чтобы добраться до каталога.

Пример:

$host = "example.com";
$port = 21;
$connection = ftp_connect($host, $port);

ftp_login($connection, "userA", "password");
ftp_pasv($connection, true);

//user's home directory is /home/userA
print_r( ftp_nlist($connection, "logs")); //works as intended
print_r( ftp_nlist($connection, "/home/userA/logs")); //does not work

Действительно запутанная часть заключается в том, что использование функций файловой системы с URL-адресом ftp дает мне прямо противоположную проблему:

opendir("ftp://userA:[email protected]:21/home/userA/logs"); //works
opendir("ftp://userA:[email protected]:21/logs"); //does not work

Поскольку пользователь/каталог вводится пользователем, я не обязательно буду знать, хотят ли они использовать абсолютный или относительный (домашний каталог) путь. Я мог бы использовать простую strstr, чтобы проверить, является ли первый символ в пути символом «/», и выбрать, какой метод использовать, но тогда я бы написал в два раза больше кода.

Должен быть более простой способ заставить какой-то метод работать как с абсолютными, так и с относительными путями. Я надеюсь, что это что-то простое, что я просто пропускаю.

Спасибо


person user1052474    schedule 29.08.2012    source источник
comment
Это похоже на проблему с вашим FTP-сервером. Я попробовал это на паре серверов, к которым у меня есть доступ, и в любом случае это работало нормально. Можете ли вы проверить введенный пользователем путь и посмотреть, начинается ли он с текущего каталога (ftp_pwd($connection))? Если это так, удалите начало пути.   -  person mcrumley    schedule 29.08.2012
comment
ftp_pwd($connection) возвращает / только. Я ожидал, что он вернет /home/userA. Я не могу придумать другого способа найти домашний каталог пользователя по умолчанию через ftp. Правда, я не админ сервера. У меня также нет доступа, чтобы что-либо изменить на ftp-сервере, и, к сожалению, у меня есть только этот для тестирования.   -  person user1052474    schedule 29.08.2012
comment
К сожалению, я не смог найти хорошего решения, поэтому просто написал два класса: один для абсолютных путей, а другой для относительных.   -  person user1052474    schedule 11.09.2012
comment
Привет, если это было полезно, пожалуйста, примите эти ответы спасибо! :)   -  person Kuf    schedule 24.12.2012
comment
Нужна дополнительная помощь? если мой ответ был полезен, пожалуйста, примите его   -  person Kuf    schedule 17.02.2013
comment
Я обнаружил, что если вы используете ftp_chdir('/a/b/c'), а затем ftp_nlist('.'), то будут выведены файлы names относительно текущего каталога. Однако, если вы используете ftp_nlist('/a/b/c'), вы получите абсолютные пути к файлам. Плохо документировано на php.net.   -  person donquixote    schedule 27.05.2015


Ответы (2)


Похоже, пользователь FTP не определен должным образом. Нет шансов, что вы можете связаться с админами ftp? Вы не написали под какой ОС работает FTP и какой FTP сервис, вот два примера как настроить домашние каталоги:

Linux с VSFTP

Создайте пользователя и установите его домашний каталог, затем отредактируйте /etc/vsftpd/vsftpd.conf:

# Uncomment this to allow local users to log in.
local_enable=YES

[[ snip ]]

# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list

Windows

создайте учетную запись пользователя, установите папку на FTP-сервере и предоставьте этому пользователю разрешение на полный доступ, а также настройте домашнюю страницу для пользователя:

  1. В Панели управления откройте «Администрирование».
  2. Дважды щелкните Управление компьютером.
  3. Разверните Локальные пользователи и группы, щелкните Пользователи, щелкните правой кнопкой мыши имя пользователя и выберите пункт Свойства.
  4. Щелкните вкладку Профиль.
  5. Убедитесь, что в разделе «Домашняя папка» выбран «Локальный путь», а затем введите соответствующий путь в поле «Локальный путь». Например, введите путь как d:\Ftp\FolderName.
person Kuf    schedule 29.08.2012

Откройте файл vsftpd.conf в /ect/vsftpd: Вставьте строку:

anon_root= /var/www/html
person user2214236    schedule 12.04.2013