python 3: разрешение на команду ftp в определенных каталогах запрещено

Ситуация:

Я пытаюсь закодировать программу автоматического загрузки и загрузки файлов ftp. Он будет перебирать мои файлы и автоматически загружать новые файлы. FTP-сервер встроен в мой Wi-Fi-роутер. Я включил ftp-сервер в свою файловую систему Ubuntu, и все работает нормально (я могу получить доступ ко всему). Домашний сайт похож на семейные папки и мою собственную папку.

Теперь моя проблема:

До сих пор я мог подключиться к серверу и перейти в свой каталог и перечислить папки. Но если я хочу перейти из этого каталога, например. C++ (это папка внутри моего каталога), я получу сообщение об ошибке «Отказано в доступе». Учетная запись пользователя, используемая для входа в систему, такая же, как и при включении моей файловой системы.

Код питона 3:

from ftplib import FTP_TLS


class ftp_client():

    def __init__(self, host, unandpw):
        self.host = host
        self.logindata = unandpw #should be a touple
        self.ftp = FTP_TLS(self.host)
        self.ftp.login(self.logindata[0], self.logindata[1])
        self.ftp.prot_p()

    def scan(self):
        self.ftp.cwd("/" + self.logindata[0] + "/")
        self.listoffiles = self.ftp.nlst()
        print("list of files: " + str(self.listoffiles))
        for file in self.listoffiles:
            self.ftp.cwd("/" + str(file) + "/")
            self.listoffilesinfiles = self.ftp.nlst()
            print(self.listoffilesinfiles)
            self.ftp.cwd("/" + self.logindata[0] + "/")

Я вызываю его через внешний основной файл...

Вывод консоли:

list of files: ['C++', 'Documents', 'Pictures', 'Python', 'School', 
'share', 'Videos']
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    ftp.scan()
  File "/home/simon/Python/autoserversync/client.py", line 18, in scan
    self.ftp.cwd("/" + str(file) + "/")
  File "/usr/lib/python3.5/ftplib.py", line 630, in cwd
    return self.voidcmd(cmd)
  File "/usr/lib/python3.5/ftplib.py", line 277, in voidcmd
    return self.voidresp()
  File "/usr/lib/python3.5/ftplib.py", line 250, in voidresp
    resp = self.getresp()
  File "/usr/lib/python3.5/ftplib.py", line 245, in getresp
    raise error_perm(resp)
ftplib.error_perm: 550 /C++/: Permission denied.

Теперь мой вопрос (очевидно): как я могу это исправить?


person Soloritur    schedule 30.03.2017    source источник
comment
Это происходит с каталогами с именем, отличным от «С++»?   -  person pvg    schedule 30.03.2017
comment
@pvg Да, я пробовал несколько других ... тот же результат   -  person Soloritur    schedule 30.03.2017
comment
Удалось ли вам писать в эти каталоги с помощью обычного ftp-клиента? И вообще, если у вас есть практически любой другой выбор протокола, используйте его вместо ftp.   -  person pvg    schedule 30.03.2017
comment
@pvg Да, я использовал веб-клиент своего Wi-Fi-маршрутизатора, интегрировал его в свою файловую систему, и все работает. Какие другие протоколы я могу выбрать, например. TCP?   -  person Soloritur    schedule 30.03.2017
comment
Я не уверен, что где работает и к чему подключается. Но вы можете просто скопировать что-то в свою коробку Ubuntu или туннелировать к ней через ssh и делать что угодно. ftp — это раздражающий и привередливый двунаправленный протокол, которого, если вы можете ему помочь, следует избегать.   -  person pvg    schedule 30.03.2017
comment
@pvg Хорошо, спасибо, попробую через ssh   -  person Soloritur    schedule 30.03.2017
comment
Давайте продолжим обсуждение в чате.   -  person Soloritur    schedule 30.03.2017
comment
Попробуйте войти в каталог каким-нибудь автономным FTP-клиентом (например, WinSCP) и покажите нам его лог.   -  person Martin Prikryl    schedule 31.03.2017
comment
@Martin Теперь я попытался войти в систему и перейти в каталог в консоли Python 3, и все сработало.   -  person Soloritur    schedule 31.03.2017
comment
Я нашел ошибку. Мне просто нужно было изменить self.ftp.cwd("/" + str(file) + "/") на self.ftp.cwd(str(file))   -  person Soloritur    schedule 31.03.2017


Ответы (1)


В строке self.ftp.cwd("/" + str(file) + "/") вы добавляете косую черту в начало пути. Помните, что в Unix путь, начинающийся с косой черты, является абсолютным путем, начинающимся с корневого каталога.

Если вместо этого ваши папки находятся в вашем домашнем каталоге (судя по их именам, я предполагаю, что это так), попробуйте вместо этого изменить его на self.ftp.cwd("~/" + str(file) + "/").

person Kirill    schedule 30.03.2017