Выполнение команд SFTP с использованием Paramiko в Python - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу подключиться к SFTP-серверу и выполнять команды, например ls.Но я получаю сообщение об ошибке:

paramiko.ssh_exception.SSHException: Невозможно открыть канал.

import paramiko
import pysftp
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('xxxxxxxx', username='xxxxxxx', password='xxxxxxxx', key_filename='xxxxxxxxxxx')
stdin, stdout, stderr = ssh.exec_command('ls')
print stdout.readlines()
ssh.close()
exit()

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Ответ на мою проблему заключается в следующем:

как прочитать ключ rsa

    pkey = paramiko.RSAKey.from_private_key_file('/Users/rajesh.maulekhi/Downloads/id_rsa')

функция resturn sftp client

def multifactor_auth_sftp_client(host, port, username, key, password):
#Create an SSH transport configured to the host
transport = paramiko.Transport((host, port))
#Negotiate an SSH2 session
transport.connect()
#Attempt authenticating using a private key
transport.auth_publickey(username, key)
#Create an event for password auth
password_auth_event = threading.Event()
#Create password auth handler from transport
password_auth_handler = paramiko.auth_handler.AuthHandler(transport)
#Set transport auth_handler to password handler
transport.auth_handler = password_auth_handler
#Aquire lock on transport
transport.lock.acquire()
#Register the password auth event with handler
password_auth_handler.auth_event = password_auth_event
#Set the auth handler method to 'password'
password_auth_handler.auth_method = 'password'
#Set auth handler username
password_auth_handler.username = username
#Set auth handler password
password_auth_handler.password = password
#Create an SSH user auth message
userauth_message = paramiko.message.Message()
userauth_message.add_string('ssh-userauth')
userauth_message.rewind()
#Make the password auth attempt
password_auth_handler._parse_service_accept(userauth_message)
#Release lock on transport
transport.lock.release()
#Wait for password auth response
password_auth_handler.wait_for_response(password_auth_event)
#Create an open SFTP client channel
return transport.open_sftp_client()
0 голосов
/ 19 февраля 2019

Похоже, вы считаете, что ваш код выполняет команду SFTP ls.Это не.Он пытается выполнить команду ls shell .Возможно, ваш сервер даже не позволяет выполнять команды оболочки, поэтому возникает ошибка.

Если вы хотите использовать SFTP, вам нужно использовать SFTPClient class и его методы, такие как SFTPClient.listdir.


Обратите внимание, что протокол SFTP не имеет текстовых команд, таких как ls.SFTP - это двоичный протокол.Команды, которые вы знаете, являются командами общего SFTP-клиента - OpenSSH sftp.Он отображает текстовые команды пользователя на двоичные запросы протокола SFTP.Точно так же класс Paramiko SFTPClient сопоставляет вызовы своих методов с эквивалентными двоичными запросами протокола SFTP.

Подробнее см. Также мой ответ на SSH-вызов подсистемы SFTP с использованием командной строки .

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