Как получить доступ к sftp-серверу, используя pysftp в python

Parent key class¶

Common API for all public keys.

class (msg=None, data=None)

Base class for public keys.

(other)

Compare this key to another. Returns 0 if this key is equivalent to
the given key, or non-0 if they are different. Only the public parts
of the key are compared, so a public key will compare equal to its
corresponding private key.

Parameters: other () – key to compare to.
(msg=None, data=None)

Create a new instance of this public key type. If is given,
the key’s public part(s) will be filled in from the message. If
is given, the key’s public part(s) will be filled in from
the string.

Parameters:
  • msg () – an optional SSH containing a public key of this type.
  • data () – an optional string containing a public key
    of this type
Raises:


if a key cannot be created from the or given, or
no key was passed in.

list of weak references to the object (if defined)

()

Return a string of an SSH made up of the public part(s) of
this key. This string is suitable for passing to to
re-create the key object later.

()

Return if this key has the private part necessary for signing
data.

classmethod (file_obj, password=None)

Create a key object by reading a private key from a file (or file-like)
object. If the private key is encrypted and is not
, the given password will be used to decrypt the key (otherwise
is thrown).

Parameters:
  • file_obj – the file-like object to read from
  • password () – an optional password to use to decrypt the key, if it’s encrypted
Returns:

a new based on the given private key

Raises:

– if there was an error reading the key

Raises:


if the private key file is encrypted, and is

Raises:

– if the key file is invalid

classmethod (filename, password=None)

Create a key object by reading a private key file. If the private
key is encrypted and is not , the given password
will be used to decrypt the key (otherwise
is thrown). Through the magic of Python, this factory method will
exist in all subclasses of PKey (such as or ), but
is useless on the abstract PKey class.

Parameters:
  • filename () – name of the file to read
  • password () – an optional password to use to decrypt the key file, if it’s
    encrypted
Returns:

a new based on the given private key

Raises:

– if there was an error reading the file

Raises:

– if the private key file is
encrypted, and is

Raises:

– if the key file is invalid

()

Return a base64 string containing the public part of this key. Nothing
secret is revealed. This format is compatible with that used to store
public key files or recognized host keys.

Returns: a base64 containing the public part of the key.
()

Return the number of significant bits in this key. This is useful
for judging the relative security of a key.

Returns: bits in the key (as an )
()

Return an MD5 fingerprint of the public part of this key. Nothing
secret is revealed.

Returns: a 16-byte (binary) of the MD5 fingerprint, in SSH
format.
()

Return the name of this private key implementation.

Returns: name of this private key type, in SSH terminology, as a (for
example, ).
(value)

Supplement the private key contents with data loaded from an OpenSSH
public key () or certificate () file, a string
containing such a file, or a object.

The .pub contents adds no real value, since the private key
file includes sufficient information to derive the public
key info. For certificates, however, this can be used on
the client side to offer authentication requests to the server
based on certificate instead of raw public key.

See:
https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys

Note: very little effort is made to validate the certificate contents,
that is for the server to decide if it is good enough to authenticate
successfully.

(data)

Sign a blob of data with this private key, and return a
representing an SSH signature message.

Parameters: data () – the data to sign.
Returns: an SSH signature .
(data, msg)

Given a blob of data, and an SSH message representing a signature of
that data, verify that it was signed with this key.

Parameters:
  • data () – the data that was signed.
  • msg () – an SSH signature message
Returns:

if the signature verifies correctly; otherwise.

(file_obj, password=None)

Write private key contents into a file (or file-like) object. If the
password is not , the key is encrypted before writing.

Parameters:
  • file_obj – the file-like object to write into
  • password () – an optional password to use to encrypt the key
Raises:

– if there was an error writing to the file

Raises:

– if the key is invalid

(filename, password=None)

Write private key contents into a file. If the password is not
, the key is encrypted before writing.

Parameters:
  • filename () – name of the file to write
  • password () – an optional password to use to encrypt the key file
Raises:

– if there was an error writing the file

Raises:

– if the key is invalid

1, SSH предоставляет два уровня проверки безопасности:

Пока ты знаешь себяУчетная запись и парольВы можете войти на удаленный хост.Все переданные данные будут зашифрованыНо вы не можете гарантировать, что сервер, который вы подключаете, это сервер, который вы хотите подключиться. возможноТам будут другие серверы при притворении реального сервераЭто также атака «посредника».

Второй уровень (проверка безопасности на основе ключей)

Надо полагаться наКлюч(Код активации), то есть вы должны создать пару ключей для себя и поставитьОткрытый ключ размещен на сервере, который необходимо доступетьОтказ Если вы хотите подключиться к серверу SSH,Клиентское программное обеспечение отправит запрос на сервер,Спросите проверку безопасности с вашим ключомОтказ После того, как сервер получает запрос, давайте посмотрим на вашу утилиту в домашнем каталоге, затемСравните его с открытым ключом, который вы отправили.Отказ Если два ключа являются последовательными, серверШифровать «вызов» с открытым ключомПоложи этоОтправить на клиентское программное обеспечение。Клиентское программное обеспечение получает «вызов»Вы можете использовать васРасшифровка закрытого ключаПоложить его сноваОтправить на сервер。

Но весь процесс входа в систему может занять 10 секунд

Setting up SSH Keys

To authenticate an SSH connection, we need to set up a private RSA SSH key (not to be confused with OpenSSH). We can generate a key using the following command:

Generate an RSA key

This will prompt us to provide a name for our key. Name it whatever you like:

RSA prompt

Next, you’ll be prompted to provide a password (feel free to leave this blank).

Now that we have our key, we need to copy this to our remote host. The easiest way to do this is by using :

Copy key to remote host

Verifying our SSH Key

If you’d like to check which keys you already have, these can be found in your system’s directory:

Check /.ssh directory

We’re looking for keys which begin with the following header:

id_rsa

Feel free to do the same on your FPS.

Используйте подпроцесс

Если мы используем Python для этого, мы обычно думаем об использовании некоторых библиотек выполнения команд, таких как os.popen, os.system, commands, subprocess и т. Д., Чтобы косвенно получить его.

Но насколько мне известно, вывод, полученный этими библиотеками, не только стандартный вывод, но и стандартная ошибка (то есть избыточная информация выше)

Следовательно, выходные данные необходимо каждый раз очищать, а затем сортировать и форматировать, чтобы получить нужные нам данные.

В качестве примера возьмем подпроцесс, например этот

Через приведенный выше текст + отображение кода вы можете почувствовать основные болевые точки входа в систему ssh

  • Первая болевая точка: Необходимо дополнительно установить sshpass (если не освобождает пароль)
  • Вторая болевая точка: Слишком много информации о помехах, очистка данных и форматирование довольно проблематичны
  • Третий болевой пункт: Реализация кода недостаточно элегантна (немного грязная), а читаемость слишком плохая.
  • Болевая точка четыре: Ssh-соединение не может быть повторно использовано, одно соединение может быть выполнено только один раз
  • Пятая болевая точка: Код доступен не на всех платформах, его можно использовать только в Linux и OSX.

Чтобы решить эти проблемы, я поискал по всей сети статьи о Python ssh, но не нашел полного введения в этот аспект навыков.

С этой целью я прочитал очень популярный проект Github: awesome-python-cn (https://github.com/BingmingWong/awesome-python-cn).

Надеюсь найти здесь полезные библиотеки для удаленного подключения.

Я действительно нашел два

  • sh.ssh
  • Paramiko

Take It And Run With It

This is where I’d like to take a moment to thank all of you, and apologize that you’re still here. I swore an oath to myself to stop posting tutorials over two thousand words long, and this one is looking to push five thousand words of nonsense. I’ll work on that. New year, new me.

For your convenience, I’ve uploaded the source for this tutorial to Github. Feel free to take this and run with it! To close things out, I’ll leave you with the meat and potatoes of the Client class we put together:

client.py

The full source code for this tutorial can be found here:

hackersandslackers/paramiko-tutorial
SSH & SCP in Python with Paramiko. Contribute to hackersandslackers/paramiko-tutorial development by creating an account on GitHub.

GitHubhackersandslackers

Our Big Beautiful Script

We now have a sick Python class to handle SSH and SCP with a remote host… let’s put it to work! The following snippet is a quick way to test what we’ve built so far. In short, this script looks for a local folder filled with files (in my case, I filled the folder with fox gifs ).

Check out how easy it is to create a main.py that handles complex tasks on remote machines thanks to our RemoteClient class:

__init__.py

Here’s the output of the our upload function:

Foxes uploaded successfully

It worked! Don’t believe me? Why don’t we check for ourselves by running ?

Output of

There you have it. Straight from the fox’s mouth.

3, структура

SSH состоит из программного и серверного программного обеспечения

имеютДве несовместимые версииОни есть:1.x и 2.x.Отказ Используйте клиентов SSH 2.x, которые не могут быть подключены к программе обслуживания, которая является SSH 1.x.Openssh 2.x поддерживает SSH 1.x и 2.x.x.SSH 1.x и SSH 2.x имеют некоторые различия в протоколе подключения.

Их рабочий механизм примерноЛокальный клиент отправляет запрос соединения на удаленный сервер,Услуги Проверьте пакет приложений и IP-адресОпять такиОтправить ключ к клиенту SSH,Локально отправить ключ обратно на серверСамостоятельное соединениеУчреждать。

Во-вторых, SFTP.

SFTP — это аббревиатура безопасного протокола передачи файлов, безопасный протокол передачи файлов.

МожетПередача файлаДавать видБезопасный метод шифрования сети。

SFTP имеет почти такую ​​же грамматику и функциональность с FTP.

SFTP является частью SSHЭто безопасный способ транспортировки файлов в сервозор блогера. Фактически, в пакете SSH уже есть подсистема передачи информации о файле безопасности под названием SFTP (безопасный протокол передачи файлов).Сам SFTP не имеет отдельного демона, который должен использовать демон SSHD (номер порта по умолчанию 22), чтобы завершить соответствующее соединение и ответитьТаким образом, в некотором смысле SFTP не похож на серверную программу и больше похоже на клиентскую программу. SFTP тожеИспользуйте зашифрованную информацию о проверке передачи передачи и переданные данныеИтак, используйте SFTP оченьБезопасностьиз. Однако из-за этого режима передачи используются технологии шифрования / дешифрования,Эффективность передачи намного ниже обычного FTPесли тыКогда сетевая безопасность требует более высоких требований, вместо FTP можно использовать SFTP.

Использование в Linux.

  • Подключите удаленный сервер: SFTP Имя пользователя @ IP Введите пароль сервера после ввода службы.
  • Загрузите файл на сервер: поставьте
  • Загрузите файлы на сервере к локальному: Get

В-третьих, используя Python’s Paramiko Module Remote Server входа

SSH — это соглашение, Openssh является одним из реализаций с открытым исходным кодом,Paramiko — это библиотека Python для реализации протокола SSHV2(Криптография под нижним слоем).

Paramiko содержит два основных компонента: sshclient и sftpclient

  • Роль SSHClient похожа на команду linux ssh,правдаПакет сеанса SSHЭтот классКапсулироватьНедействительныйТРАНСПОРТ,Канал (канал)иSFTPClient Установленный метод (Open_SFTP)Обычно используется дляВыполнить удаленную команду。
  • SFTPClient похож на команду SFTP с Linux,Клиентский пакет SFTPИспользовалРеализуйте дистанционную операцию файлаТакие как загрузка файлов, загрузка, изменение разрешений на файл и другие операции.
  1. Channel: Это своего рода розетка, безопасный канал передачи SSH
  2. Transport: Это зашифрованная сессия. При использовании его я создадим зашифрованные туннели (канал), эти туннели называются каналом
  3. Session: Это объект, который клиент держит соединение с сервером, запуск сеанса с подключением () / start_client () / start_server ()

Starting our Script

Let’s install our libraries. Fire up whichever virtual environment you prefer and let em rip:

Install paramiko & scp

Just one more thing before we write some meaningful Python code! Create a config file to hold the variables we’ll need to connect to our host. Here are the barebones of what we need to get into our server:

  • Host: The IP address or URL of the remote host we’re trying to access.
  • Username: This is the username you use to SSH into your server.
  • Passphrase (optional): If you specified a passphrase when you created your ssh key, specify that here. Remember that your SSH key passphrase is not the same as your user’s password.
  • SSH Key: The file path of the key we created earlier. On OSX, these live in your system’s ~/.ssh folder. SSH key we’re targeting must have an accompanying key with a .pub file extension. This is our public key; if you were following along earlier, this should have already been generated for you.

If you’re trying to upload or download files from your remote host, you’ll need to include two more variables:

  • Remote Path: The path to the remote directory we’re looking to target for file transfers. We can either upload things to this folder or download the contents of it.
  • Local Path: Same idea as above, but the reverse. For our convenience, the local path we’ll be using is simply /data, and contains pictures of cute fox gifs.

Now we have everything we need to make a respectable config.py file:

config.py

Используйте sh.ssh

Давайте представим первую,

Это библиотека, которая позволяет выполнять системные команды Linxu / OSX с помощью вызовов функций. Она очень проста в использовании. Я также напишу о ней введение, если у меня будет возможность.

Сегодня представим только одну из его функций:

Обычно две машины посещают друг друга.Для удобства можно установить беспарольный вход, чтобы пароль не требовался.

Этот код может обеспечить вход без пароля и выполнять наши команды

Но возможно, что мы не хотим устанавливать взаимное доверие и отсутствие секретов.Чтобы сделать этот код более универсальным, я предполагаю, что мы не устанавливаем секретность и можем только войти в систему с паролем.

Проблема здесь. Чтобы ввести пароль, необходимо использовать интерактивный метод для его ввода. Как вы реализуете его в Python?

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

Это проще.

Мне нужно только признать Слова, просто впишите мой пароль в стандартный ввод.

Полный код выглядит следующим образом:

Это некоторая информация, содержащаяся в официальном документе (http://amoffat.github.io/sh/tutorials/interacting_with_processes.html?highlight=ssh) и написанном демо.

Попытавшись запустить его, я обнаружил, что программа всегда будет работать, никогда не вернется, никогда не завершится и функция обратного вызова никогда не войдет.

Через отладку, чтобы просмотреть исходный код, все еще не могу найти проблему, поэтому перейдитеGithub Я поискал его и обнаружил, что эта проблема уже существовала в 2017 году, но не была исправлена ​​в 2020 году. Кажется, он использует Людей было немного, поэтому я спросил еще раз, надеясь получить ответ.

Вышеупомянутая проблема возникает только тогда, когда вам нужно ввести пароль.Если установлено взаимное доверие между машинами, проблем нет.

Чувствовать Для эффекта использования я установил взаимное доверие и секретность, а затем использую следующий код.

Удивлен, что нашел применение сюда, с Кажется, что это происходит через одно и то же соединение ssh и дважды выполнить команду, но на самом деле вы можете выполнить команду top на удаленном компьютере, чтобы увидеть изменения в подключенном терминале. Еще раз, Указывая, что выполнение двух команд достигается через два соединения.

Похоже, что с помощью Он может решить первую болевую точку (если вышеперечисленные проблемы можно решить), вторую и третью болевые точки.

Но повторно использовать ssh-соединение все равно нельзя, все равно не очень удобно, не лучшее решение в моих идеалах.

самый важный момент, Этот модуль поддерживает только Linxu / OSX, в Windows вы должны использовать его братскую библиотеку — А потом я зашел в pypi и посмотрелpbs, Давно находится «в аварийном состоянии», никто не обслуживает.

В этот момент я стал последней каплей от «пешки».

Uploading (and Downloading) Files via SCP

SCP refers to both the protocol for copying files to remote machines (secure copy protocol) as well as the Python library, which utilizes this. We’ve already installed the SCP library, so import that shit.

The SCP and Paramiko libraries complement one another to make uploading via SCP super easy. SCPClient() creates an object which expects  «transport» from Paramiko, which we provide with . Creating an SCP connection piggybacks off of our SSH client in terms of syntax, but these connections are separate. It’s possible to close an SSH connection and leave an SCP connection open, so don’t do that. Open an SCP connection like this:

Open an SCP connection.

Uploading a single file is boring, so let’s upload an entire directory of files instead. accepts a list of file paths:

client.py

Our method is expecting to receive a list of strings, each representing the local path to a file, we’d like to upload.

SCP’s method will upload any number of files to a remote host. This will replace existing files with the same name if they happen to exist at the destination we specify. That’s all it takes!

Пример использования paramiko¶

Пример использования paramiko (файл 3_paramiko.py):

import paramiko
import time
import socket
from pprint import pprint


def send_show_command(
    ip,
    username,
    password,
    enable,
    command,
    max_bytes=60000,
    short_pause=1,
    long_pause=5,
):
    cl = paramiko.SSHClient()
    cl.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    cl.connect(
        hostname=ip,
        username=username,
        password=password,
        look_for_keys=False,
        allow_agent=False,
    )
    with cl.invoke_shell() as ssh
        ssh.send("enable\n")
        ssh.send(f"{enable}\n")
        time.sleep(short_pause)
        ssh.send("terminal length 0\n")
        time.sleep(short_pause)
        ssh.recv(max_bytes)

        result = {}
        for command in commands
            ssh.send(f"{command}\n")
            ssh.settimeout(5)

            output = ""
            while True
                try
                    part = ssh.recv(max_bytes).decode("utf-8")
                    output += part
                    time.sleep(0.5)
                except socket.timeout
                    break
            resultcommand = output

        return result


if __name__ == "__main__"
    devices = "192.168.100.1", "192.168.100.2", "192.168.100.3"
    commands = "sh clock", "sh arp"
    result = send_show_command("192.168.100.1", "cisco", "cisco", "cisco", commands)
    pprint(result, width=120)

Результат выполнения скрипта:

2, SSH в основном состоит из трех частей:

Предусмотрена аутентификация сервера, конфиденциальность и целостность. Кроме того, это иногда обеспечивает сжатие. SSH-TRANS обычно работаетTCP/IPПодключитесь, также можно использовать в других надежных потоках данных.

Пользовательский протокол сертификации

Используется для предоставления функций аутентификации пользователей клиента к серверу. Он работает внутрьТранспортный слойСоглашение SSH-Trans Top. Когда SSH-userAuth начнется, он получает сеанс от договора низкого уровня.Идентификатор(С первого разаКлючОбмен хэш h)

Протокол подключения

Разделите несколько зашифрованных туннелей в логические каналы. Он работает в протоколе аутентификации пользователя. Он обеспечивает интерактивный вход в систему, удаленное выполнение команды, пересылки TCP / IP-соединений и пересылки соединений X11.

Creating an SSH Client

We’re going to create a class called RemoteClient to handle the interactions we’ll be having with our remote host. Before we get too fancy, let’s just start things off by instantiating the RemoteClient class with the variables we created in config.py:

client.py

Nothing impressive so far: we’ve just set some variables and passed them into a useless class. Let’s kick things up a notch without leaving our constructor:

client.py

We’ve added three new things to be instantiated with our class:

  • : self.client will ultimately serve as the connection objection in our class, similar to how you have dealt with terminology like in database libraries. Our connection will be until we explicitly connect to our remote host.
  • : Similar to self.client, but exclusively handles connections for transferring files.
  • isn’t a variable, but rather a function to be run automatically whenever our client is instantiated. Calling is telling our RemoteClient object to check for local ssh keys immediately upon creation so that we can try to pass them to our remote host. Otherwise, we wouldn’t be able to establish a connection at all.

Используйте paramiko

С последней надеждой я попытался использовать Эта библиотека наконец-то Здесь восстанавливается элегантность, которая должна принадлежать Python.

Вы можете установить его с помощью следующей команды

Затем я расскажу о нескольких наиболее часто используемых методах входа в ssh.

Метод 2: войдите в транспортный режим, используя имя пользователя и пароль.

Метод 1 — это традиционная операция подключения к серверу, выполнения команд и закрытия. Множественные операции необходимо подключать несколько раз, и соединения нельзя использовать повторно 。

Иногда вам необходимо войти на сервер для выполнения нескольких операций, таких как выполнение команд и загрузка / скачивание файлов. Метод 1 не может быть реализован, поэтому вы можете использовать метод транспорта.

Метод 4: вход в транспортный режим на основе ключа

Вышеупомянутые четыре метода могут помочь вам удаленно войти на сервер для выполнения команд. Если вам нужно повторно использовать соединения: одно соединение выполняет несколько команд, вы можете использоватьМетод второй с Метод четвертый

Не забудьте закрыть соединение после использования.

Реализовать передачу файлов sftp

В то же время paramiko — отличное решение для ssh, он очень профессиональный, а также может осуществлять передачу файлов sftp.

К этому моменту Paramiko уже выигрывал, но все еще есть болевой момент, о котором мы не упомянули, то есть мультиплатформенность, то есть Windows. Здесь есть и хорошие, и плохие моменты.

Хорошая вещь: paramiko поддерживает окна

Плохо то, что вам нужно проделать много сложных приготовлений, вы можете решить эту проблему в Google, но я предлагаю вам сразу отказаться, яма слишком глубокая.

1, метод SSHClient Вход и общие методы

Connect (): реализовать соединение и аутентификацию удаленных серверов

Параметр:

Set_missing_host_key_policy (): устанавливает политику отклика, когда удаленный сервер не записан в файле all_hosts

В настоящее время поддерживают три стратегии:

Exec_command (): Метод выполнения команд Linux на удаленных серверах

Возвращает три переменных: stdin — это стандартный вход, STDOUT является правильным выходом, STDERR — это выходной сигнал (STDOUT и STDERR будет выводить только один)

Open_SFTP (): создать сеанс SFTP на основе текущей сессии SSH.

Этот метод возвращает объект SFTPClient (Объект SFTP на основе текущего соединения)Затем вы можете выполнить операцию файла

Постраничный вывод команд¶

Пример использования paramiko для работы с постраничным выводом команд
show (файл 3_paramiko_more.py):

import paramiko
import time
import socket
from pprint import pprint
import re


def send_show_command(
    ip,
    username,
    password,
    enable,
    command,
    max_bytes=60000,
    short_pause=1,
    long_pause=5,
):
    cl = paramiko.SSHClient()
    cl.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    cl.connect(
        hostname=ip,
        username=username,
        password=password,
        look_for_keys=False,
        allow_agent=False,
    )
    with cl.invoke_shell() as ssh
        ssh.send("enable\n")
        ssh.send(enable + "\n")
        time.sleep(short_pause)
        ssh.recv(max_bytes)

        result = {}
        for command in commands
            ssh.send(f"{command}\n")
            ssh.settimeout(5)

            output = ""
            while True
                try
                    page = ssh.recv(max_bytes).decode("utf-8")
                    output += page
                    time.sleep(0.5)
                except socket.timeout
                    break
                if "More" in page
                    ssh.send(" ")
            output = re.sub(" +--More--| +\x08+ +\x08+", "\n", output)
            resultcommand = output

        return result


if __name__ == "__main__"
    devices = "192.168.100.1", "192.168.100.2", "192.168.100.3"
    commands = "sh run"
    result = send_show_command("192.168.100.1", "cisco", "cisco", "cisco", commands)
    pprint(result, width=120)
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: