SFTP известен как протокол передачи файлов SSH, а также как безопасный протокол передачи файлов. SFTP — это сетевой протокол, обеспечивающий доступ к файлам, их передачу и управление файлами через любой надежный поток данных.
В данном руководстве рассмотрим, как получить доступ к SFTP-серверу с помощью PySftp в Python.
FTP-сервер Python
Модуль Python pysftp — это простой интерфейс для SFTP. Он предлагает высокоуровневые абстракции и подпрограммы на основе задач для удовлетворения потребностей SFTP. Однако протокол SFTP не поддерживает аутентификацию и безопасность; он ожидает, что базовый протокол защитит его. В результате SFTP наиболее широко используется в качестве подсистемы реализации протокола SSH версии 2, разработанной той же рабочей группой.
Давайте установим модуль sftp pysftp.
Установка pysftp
|
1 2 3 4 5 |
pip install pysftp # or python3 -m pip install pysftp |
В зависимости от вашей версии Python и pip он будет установлен в вашей системе.
Если вы не знаете, как обновить pip, ознакомьтесь с руководством по обновлению pip.
Получение доступа к SFTP-серверу с помощью PySftp
Вы можете просмотреть содержимое каталога, используя pysftp в Python. Для этого вам нужно ваше имя хоста, имя пользователя и пароль.
Затем вам нужно переключиться из каталога с помощью метода cwd или chdir и указать удаленный каталог в качестве первого аргумента.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import pysftp myHostname = "newblog.com" myUsername = "root" myPassword = "root" with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword) as sftp: print("Connection succesfully stablished ... ") # Switch to a remote directory sftp.cwd('/var/www/vhosts/') # Obtain structure of the remote directory '/var/www/vhosts' directory_structure = sftp.listdir_attr() # Print data for attr in directory_structure: print(attr.filename, attr) # connection closed automatically at the end of the with statement |
Конечно, это фиктивный сервер, которого не существует. Тем не менее, в реальной жизни вы должны использовать переменные среды для получения фактических учетных данных в любом файле по соображениям безопасности и не помещать все учетные данные в отдельные файлы. Всегда помещайте в файл переменных среды. Например, файл .env.
Теперь давайте посмотрим, что происходит. Приведенный выше код одинаков и для вас, вы должны ввести свои учетные данные, и код будет работать для вас.
Сначала мы импортировали модуль pysftp, а затем предоставили мое имя хоста, имя пользователя и пароль.
Затем мы использовали оператор Python with, чтобы открыть безопасное соединение с удаленным сервером, указав имя хоста, имя пользователя и пароль. В случае успеха мы переключим удаленный каталог, чтобы получить список и распечатать один за другим в консоли.
Список в произвольном порядке. Он не включает уникальные записи ‘.’ и ‘..’. Каждый возвращаемый объект SFTPAttributes будет иметь дополнительное поле: длинное имя, которое может содержать отформатированную строку атрибутов файла в формате UNIX. Содержимое строки будет зависеть от SFTP-сервера.
Как загрузить файл
Чтобы загрузить файл на удаленный сервер через SFTP с помощью pysftp, вам необходимо использовать метод sftp.put() клиента SFTP. Метод put принимает в качестве первого аргумента относительный или абсолютный локальный путь к файлу, который вы хотите загрузить, а в качестве второго аргумента — удаленный путь, по которому файл должен быть загружен.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import pysftp myHostname = "newblog.com" myUsername = "root" myPassword = "root" with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword) as sftp: print("Connection succesfully stablished ... ") # Define a file that you want to upload from your local directorty # or absolute "/Users/krunal/Desktop/code/pyt/app.txt" localFilePath = './app.txt' # Define the remote path where the file will be uploaded remoteFilePath = '/var/backups/app.txt' # Use put method to upload a file sftp.put(localFilePath, remoteFilePath) # connection closed automatically at the end of the with statement |
Сначала мы установили безопасное соединение в этом коде, а затем определили два пути к файлам:
- localFilePath: это путь к локальному файлу.
- remoteFilePath: это путь к удаленному файлу.
Затем мы использовали метод sftp.put() для загрузки файла на сервер.
Как скачать удаленные файлы с помощью pysftp
В предыдущем разделе мы видели, как загрузить файл. Теперь давайте посмотрим, как скачать файл.
Чтобы загрузить удаленный файл с сервера с помощью pysftp, мы должны открыть соединение и из экземпляра sftp и использовать метод get, который ожидает путь к удаленному файлу, который будет загружен, и второй аргумент как локальный путь, где файл должен быть сохранен.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import pysftp myHostname = "newblog.com" myUsername = "root" myPassword = "root" with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword) as sftp: print("Connection succesfully stablished ... ") # Define the remote path file path remoteFilePath = '/var/backups/app.txt' # Define a directory in which you have to save the file. # or absolute "/Users/krunal/Desktop/code/pyt/app.txt" localFilePath = './app.txt' # Use get method to download a file sftp.get(remoteFilePath, localFilePath) # connection closed automatically at the end of the with statement |
Мы определили соединение в приведенном выше коде, а затем определили два пути к файлам.
- remoteFilePath: это путь, по которому находится файл.
- localFilePath: это путь, по которому будет загружен файл.
На следующем шаге мы использовали метод get() для загрузки файла.
Как удалить файл с помощью pysftp
Вы можете удалить файл с помощью pysftp, используя метод sftp.remove(). Метод remove() ожидает абсолютный путь к удаленному файлу в качестве первого аргумента.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import pysftp myHostname = "newblog.com" myUsername = "root" myPassword = "root" with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword) as sftp: print("Connection succesfully stablished ... ") # Define the remote path file path removeFilePath = '/var/backups/app.txt' sftp.remove(removeFilePath) # connection closed automatically at the end of the with statement |
В этом коде мы открыли соединение, а затем определили переменную removeFilePath, которая содержит путь к файлу, который необходимо удалить.
Затем мы использовали метод sftp.remove() для удаления файла с удаленного сервера.
Модуль PySftp имеет широкий спектр методов, которые вы можете использовать для выполнения различных действий, таких как обработка разрешений и т. д., поэтому не забудьте проверить официальный веб-сайт документации здесь.
