Python ftplib msld ошибка: 500 Команда не понята

1

Я пытаюсь создать скрипт Python для получения файлов с FTP. Он работает прямо сейчас, но я тестировал его на странице бесплатного хостинга https://hosting.miarroba.com. Если я подключу его к моей FTP-службе выделенного сервера,

500 Команда не поняла

Команда, которую я считаю неудачной, - ftp.mlsd(). Я не знаю, нужна ли мне и специальная настройка на моем сервере.

Код Python 3.5

def realizarConexion():
a_server = ""
a_user = ""
a_pass = ""
a_port = 

# Conectarse con los métodos connect y login
try:
    ftp = FTP() 
    ftp.connect(a_server, a_port, -999) 
    ftp.login(a_user, a_pass)
    #ftp.dir()
    estado = validaFecha()
    if estado:
        descargarFicheros(ftp)
    else:
        print("No existe una anterior fecha de respaldo configurada")
    ftp.close()
except Exception as e:
    print("Fallo al conectar con FTP %s: %s" %(a_server, e))

def obtenerFecha():
ultFecha = ""
try:
    fDate = open("date.txt","r")
    if fDate.mode == 'r':
        ultFecha = fDate.read()
except Exception as e:
    print("Sin fecha asignada!")
return ultFecha

def validaFecha():
estadoFecha = True
try:
    fDate = open("date.txt","r")
    if fDate.mode == 'r':
        ultFecha = fDate.read()
        print("fecha: %s" %ultFecha)
except Exception as e:
    respaldo = input('No hay fechas configuradas, desea tomar la fecha actual como fecha de ultimo respaldo! - (Y / N): ')
    if respaldo.lower() == "y":
       asignarFechaCopia()
       print("La asignación de la fecha se a ha generado con exito")
       estadoFecha = True
    elif respaldo.lower()  == "n":
        print("Copia de seguridad detenida!") 
        estadoFecha = False
    else:
        print("Copia de seguridad detenida!")
        estadoFecha = False
return estadoFecha

def descargarFicheros(ftp): 
try:
    for file, parametros in ftp.mlsd():
        if file != '.' and file != '..':
            fechaCopia = obtenerFecha()[0:10]
            horaCopia = obtenerFecha()[11:19]
            fechaModif = datetime.datetime.strptime(parametros["modify"][0:-6],"%Y%m%d").date()
            horaModif = datetime.datetime.strptime(parametros["modify"][8:14],"%H%M%S").time()
            f1 = time.strptime(str(fechaCopia) + " " + str(horaCopia), "%Y-%m-%d %H:%M:%S")
            f2 = time.strptime(str(fechaModif) + " " + str(horaModif), "%Y-%m-%d %H:%M:%S")
            if f2 > f1:
                print("Se ha actualizado el fichero => %s" %file)
                ftp.retrbinary("RETR " + file ,open(file, 'wb').write)
            else:
                print("%s Archivo sin cambios %s %s " %(fechaCopia,fechaModif,file))
    print("Proceso finalizado!! Se ha actualzado la fecha de copiado de archivos.")
    asignarFechaCopia()                     
except Exception as e:
    print("Error: %s" %e)    

def asignarFechaCopia():
t = time.strftime("%Y-%m-%d %H:%M:%S")
fDate = open("date.txt","w+")
fDate.write(t)
fDate.close()

#Inicialización del Script     
realizarConexion()
Теги:
iis
ftp
ftplib

2 ответа

0

Многие серверы не поддерживают команду MLSD, так как это относительно новая команда (в терминах FTP). И особенно IIS этого не делает.


Если вам нужны только имена файлов, вместо этого используйте FTP.nlst.

Если вам нужны атрибуты файлов, вам нужно использовать FTP.dir (или FTP.retrlines) и проанализировать возвращаемый список.

См. Также Как проанализировать список файлов, чтобы получить только имена файлов в Python?

  • 0
    Спасибо за исправления и ваш ответ !! Если мне нужна временная метка файла, работает ли FTP.nlst?
  • 0
    Нет, nlst не даст вам меток времени (если вы не вызываете MDTM для каждого файла, возвращаемого nlst , см. Также stackoverflow.com/q/29026709/850848 ). Для MLSD списка с MLSD времени на сервере, который не поддерживает MLSD , вам нужен dir (команда LIST ).
-1

Вы можете использовать wirehark или tcpdump, чтобы увидеть, что отправляется на сервер в виде открытого текста, фильтруя для порта 21. Вы должны быть в состоянии точно увидеть, что происходит и откуда начинается "Командная строка 500".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню