ftplib без ошибок подключается к SFTP-серверу

Некоторое время назад я создал полную FTP-библиотеку. Теперь я хочу подключиться к серверу SFTP. Насколько я выяснил в своем исследовании, это невозможно с использованием ftplib. Тем не менее я попытался подключиться к серверу только по SFTP, и он работал без проблем. Никакой ошибки и никакого исключения!

Теперь я немного запутался, так как не уверен, действительно ли это безопасное соединение (что важно для этого приложения). Тем более что подобных кейсов в сети найти не удалось. Это подводит меня к следующим вопросам:

  1. Как узнать, зашифровано ли соединение? (текущий статус: не зашифровано)
  2. Если соединение не зашифровано: как я могу поддерживать SFTP без необходимости перекодировать всю мою библиотеку?

Это базовый код, который я использую:

server = 'host-adress'
user = 'username'
password='password'                                                               
ftp = FTP(server)
ftp.login(user,password)

Все операции, такие как загрузка и загрузка файлов, работают нормально.
Согласно моему хосту, сервер настроен как SFTP.

Ведение журнала возвращает это как результат:

*cmd* 'USER username'
*put* 'USER username\r\n'
*get* '331 Password required for username\n'
*resp* '331 Password required for username'
*cmd* 'PASS ********'
*put* 'PASS ********\r\n'
*get* '230 User username logged in\n'
*resp* '230 User username logged in'

person frameworker    schedule 22.03.2017    source источник
comment
Что такое sftplib? Это опечатка? Вы имеете в виду ftplib?   -  person Martin Prikryl    schedule 22.03.2017
comment
Покажите нам свой код, который использует ftplib для подключения к SFTP-серверу.   -  person Martin Prikryl    schedule 22.03.2017
comment
@MartinPrikryl извините, исправил опечатку и добавил важный код   -  person frameworker    schedule 22.03.2017
comment
Это очевидно, что вы не подключаетесь к SFTP. Установите FTP.set_debuglevel и покажите нам журнал.   -  person Martin Prikryl    schedule 22.03.2017
comment
@MartinPrikryl Этот лог вроде нормальный. Я думал, что сервер не только sftp, и они просто так сказали.   -  person frameworker    schedule 22.03.2017
comment
Ваш журнал без всяких сомнений показывает протокол FTP.   -  person Martin Prikryl    schedule 22.03.2017
comment
Есть ли способ обновления до sftp без необходимости перекодировать все, используя pysftp или paramiko ?   -  person frameworker    schedule 22.03.2017
comment
Конечно, нет. Опять же, эти два протокола не имеют ничего общего. Если кто-то не написал ftplib-подобную оболочку для Paramiko / pysftp, о чем я не знаю.   -  person Martin Prikryl    schedule 22.03.2017
comment
А почему вы спрашиваете? Сервер использует FTP!   -  person Martin Prikryl    schedule 22.03.2017
comment
@MartinPrikryl Хорошо, я надеялся, что есть библиотека, использующая ту же логику команд. И я спросил, потому что мне нужно использовать sftp-сервер по соображениям безопасности. ftp не вариант.   -  person frameworker    schedule 23.03.2017
comment
FTP имеет безопасный вариант FTPS (FTP через TLS / SSL). Просто используйте FTP_TLS вместо FTP (см. Мой отредактированный ответ). Вполне вероятно, что именно это имеет в виду ваш хост.   -  person Martin Prikryl    schedule 23.03.2017


Ответы (1)


FTP и SFTP - два совершенно разных протокола. У них нет абсолютно ничего общего. Нет никаких шансов, что вы сможете подключиться с помощью библиотеки FTP к серверу SFTP.

В вашем журнале без всяких сомнений отображается сеанс FTP.

Хотя вы (или ваш хост) можете ошибочно принять SFTP с FTPS (FTP через TLS / SSL). См. FTPS по сравнению с SFTP. Для FTPS просто используйте FTP_TLS class вместо FTP. Интерфейс такой же (FTP_TLS происходит от FTP).

Если вам действительно нужен SFTP (через SSH), вам нужно использовать другую библиотеку, например Paramiko или pysftp.
См. SFTP в Python? (не зависит от платформы).

person Martin Prikryl    schedule 22.03.2017
comment
Да, я знаю, есть разница. Вот почему я запутался. Мой хост говорит, что это только sftp-сервер, но я могу подключиться, используя приведенный выше код. - person frameworker; 22.03.2017