Paramiko- Как да SSH и трансфер на файлове с python

Така че съм нает в компания от социални медии с продукт, който работи много като фейсбук и през изминалата седмица трябваше да реша проблем с загубата на връзката между видео URL на нашия db с действителното съдържание на сървъра. Едно несъответствие с Калтура. Но както и да е, накратко, трябваше да напиша малък скрипт, който да изтегля видеоклипове от отдалечен сървър, който да се качва в Kaltura и да получавам нови URL адреси, които да заменят старите в db.

SSH е методът, който обикновено се използва за достъп до отдалечена машина и изпълнение на команди, извличане на файлове или качване на файлове.

Можете да прехвърляте файлове от отдалечената машина към локалната или обратно, като използвате SFTP (Secure File Transfer Protocol) и SCP (Secure Copy Protocol).

Според paramiko.org, моделът python paramiko дава абстракция на SSHv2 протокола както от страна на клиента, така и от страна на сървъра. Като клиент можете да се удостоверите чрез парола или ключ и като сървър можете да решите на кои потребители е разрешен достъп и каналите, които разрешавате

В този блог се фокусирам върху страната на клиента.

Нека да продължим с това

Основният клиент на Paramiko, както е документирано в API, е Paramiko.SSHClient. Екземпляр на Paramiko.SSHClient може да се използва за осъществяване на връзки към отдалечения сървър и прехвърляне на файлове

ОПРЕДЕЛЯНЕ НА ВРЪЗКА

внос парамико
ssh_client = paramiko.SSHClient ()
ssh_client.connect (име на хост = 'име на хост ", потребителско име =' mokgadi", парола = 'mypassword ")
#Raises BadHostKeyException, AuthenticationException, SSHException, грешка на сокета

когато опитате това, получавате следната грешка:
missing_host_key повишаване на SSHException („Сървър% r не е намерен в известни_хости“% име на хост) paramiko.ssh_exception.SSHException: Сървърът „име на хост“ не е намерено в известни_хости

Разбиране на известни домакини

Виждате тази грешка, защото не сте информирали вашата машина, че отдалечения сървър, на когото се „доверявате“ на сървъра, до който се опитвате да получите достъп. Ако отидете на вашия команден ред или терминал и се опитате да се свържете със сървър за първи път, ще получите съобщение, подобно на това:

Не може да се установи автентичността на хост „име на хост“. Отпечатъкът на ключ на ключ на RSA е „ключ“. Сигурни ли сте, че искате да продължите да се свързвате (да / не)?

Когато изберете „да“ тук, уведомявате вашата машина, че тя може да се доверява на машината и вече можете да получите достъп до нея без подкана, докато ключът за тази машина не се промени.
Paramiko по подобен начин изисква да утвърдите доверието си в машината. Това валидиране се обработва чрез извикване set_missing_host_key_policy () на SSHClient и преминаване на политиката, която искате да внедрите при достъп до нова отдалечена машина. По подразбиране paramiko.SSHclient задава политиката на RejectPolicy. Правилото отхвърля връзката, без да валидира както видяхме по-горе. Парамико обаче ви дава начин да сортирате ключовата политика „Доверете се на всички“, AutoAddPolicy. Разбирането на екземпляр от AutoAddPolicy в set_missing_host_key_policy () го променя, за да позволи на всеки хост.

внос парамико
ssh_client = paramiko.SSHClient ()
ssh_client.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
ssh_client.connect (име на хост = 'име на хост ", потребителско име =' mokgadi", парола = 'mypassword ")

Сега трябва да сте на зелено

РЕМОНТНИ КОМАНДИ НА ДЪЛЖИТЕЛНАТА МАШИНА
За изпълнение на команда exec_command се извиква на SSHClient с предадената команда. Отговорът се връща като кортеж (stdin, stdout, stderr)
Например, за да изброите всички файлове в директория:

стандартния вход, стандартния изход, STDERR = ssh_client.exec_command ( "LS")

Получаване на типа за всеки от върнатите,
type (stdin) и type (stdout) е „paramiko.channel.ChannelFile“
type (stderr) е клас „paramiko.channel.ChannelStderrFile“

Според paramiko.org всички те са python файл като обекти.

Stdin е файл само за запис, който може да се използва за команди, изискващи въвеждане
Файлът stdout дава изхода на командата
Stderr дава грешките, върнати при изпълнение на командата. Ще бъде празен, ако няма грешка

за командата по-горе
>>> печат (stdout.readlines ()) → [u'anaconda-ks.cfg \ n ', u'database_backup \ n', u'Desktop \ n ', u'Documents \ n', u'Downloads \ n ',…. u'Public \ n ', u'Templates \ n', u'Videos \ n ']

>>> печат (stderr.readlines) → []

КОМАНДИ, ИЗИСКВАЩИ ВХОД
Понякога трябва да предоставите парола или допълнителен вход, за да изпълните команда. За това се използва stdin. Нека изпълним същата команда по-горе със sudo.

stdin, stdout, stderr = ssh.exec_command („sudo ls“)
stdin.write ( "mypassword \ Н")
печат stdout.readlines ()

Трябва да върне списък с файлове и папки, както по-горе.

ФАЙЛНИ ТРАНСФЕРИ
Прехвърлянията на файлове се обработват от paramiko.SFTPClient, който получавате от повикване на open_sftp () в инстанция на Paramiko.SSHClient.

Изтегляне на файл от отдалечена машина

ftp_client = ssh_client.open_sftp ()
ftp_client.get ( "remotefileth", "localfilepath")
ftp_client.close ()

Качване на файл от локална към отдалечена машина

ftp_client = ssh.open_sftp ()
ftp_client.put ( "localfilepath", remotefilepath ")
ftp_client.close ()

Отиди и ме поправи там, където трябва :). Моля, следвайте или се абонирайте за моя блог, за да получавате известия за всякакви нови публикации