Проблемы с Paramiko SFTP, когда пароль не используется - PullRequest
0 голосов
/ 18 ноября 2010

Мне нужно загрузить некоторые файлы, используя SFTP, это работает из командной строки:

$sftp myuser@my_remote_host
Connected to my_remote_host
sftp>

Это мой скрипт Paramiko:

#!/usr/bin/env python
import paramiko
import sys
import os

host = "my_remote_host"
port = 22

transport = paramiko.Transport((host, port))

username = "myuser"      

LOCAL_PATH = "/tmp/"
REMOTE_PATH = "/dcs/tmp/"
FILE = "myfile"

transport.connect(username = username)

sftp = paramiko.SFTPClient.from_transport(transport)
path = LOCAL_PATH + FILE
sftp.put(LOCAL_PATH + FILE, REMOTE_PATH + FILE)

sftp.close()
transport.close()
print 'Upload done.'

При выполнении я получаю эту ошибку:

No handlers could be found for logger "paramiko.transport"
Traceback (most recent call last):
  File "./my_sftp.py", line 19, in ?
    sftp = paramiko.SFTPClient.from_transport(transport)
  File "/usr/lib/python2.4/site-packages/paramiko/sftp_client.py", line 102, in from_transport
    chan = t.open_session()
  File "/usr/lib/python2.4/site-packages/paramiko/transport.py", line 655, in open_session
    return self.open_channel('session')
  File "/usr/lib/python2.4/site-packages/paramiko/transport.py", line 745, in open_channel
    raise e
EOFError

При добавлении приватного ключа я получаю эту ошибку:

path = os.path.join(os.environ['HOME'], '.ssh', 'id_dsa')
key = paramiko.DSSKey.from_private_key_file(path)
transport.connect(username = username, pkey=key)

Traceback (most recent call last):
  File "./my_sftp.py", line 24, in ?
    transport.connect(username = username, pkey=key)
  File "/usr/lib/python2.4/site-packages/paramiko/transport.py", line 1007, in connect
    self.auth_publickey(username, pkey)
  File "/usr/lib/python2.4/site-packages/paramiko/transport.py", line 1234, in auth_publickey
    return self.auth_handler.wait_for_response(my_event)
  File "/usr/lib/python2.4/site-packages/paramiko/auth_handler.py", line 174, in wait_for_response
    raise e
paramiko.AuthenticationException: Authentication failed.

1 Ответ

2 голосов
/ 18 ноября 2010

В первом примере вы не можете аутентифицироваться только с именем пользователя, поэтому сеанс не может быть запущен.

Я не могу сказать, почему ваш пример с приватным ключом не работает без дополнительной информации. Возможно ли, что это неправильный ключ для этого сервера? SSH в командной строке может пытаться использовать несколько ключей или получать их от агента.

В любом случае, легче начать с класса SSHClient. Он обернет все элементы аутентификации и проверки хоста в один пакет. Также имеется удобный метод open_sftp() для возврата экземпляра SFTPClient.

...