2016-10-06 2 views
0

Я относительно новичок в python и впервые пытаюсь использовать sftp через скрипт python. Я хочу, чтобы мой скрипт python получал файл с двухъядерной машины (оба IPv4 и IPv6 присутствуют). Ниже приведен фрагмент кода, я использую для Paramiko:SFTP через Paramiko для ipv6 linux machine

host = ip #ip is a string that has the value of IP 
port = 22 
transport = paramiko.Transport((host, port)) 
transport.connect(username = username, password = password) 
sftp = paramiko.SFTPClient.from_transport(transport 

Когда я использую код с IPv4 он работает отлично. Но когда я заменить IP с адресом IPv6, генерируется следующая ошибка:

Traceback (most recent call last): 
File "MyFile.py", line 92, in <module> 
putFile() 
File "MyFile.py", line 29, in analyzeLogs 
transport = paramiko.Transport((host, port)) 
File "/usr/lib/python2.6/site-packages/paramiko/transport.py", line 289, in __init__ 
sock.connect((hostname, port)) 
File "<string>", line 1, in connect 
socket.gaierror: [Errno -2] Name or service not known 

Я проверил для решения и нашел кого-то с предложением добавить интерфейс вместе с IP, но при попытке такой же я получил следующее сообщение об ошибке:

Traceback (most recent call last): 
File "MyFile.py", line 92, in <module> 
putFile() 
File "MyFile.py", line 29, in analyzeLogs 
transport = paramiko.Transport((host, port)) 
File "/usr/lib/python2.6/site-packages/paramiko/transport.py", line 289, in __init__ 
sock.connect((hostname, port)) 
File "<string>", line 1, in connect 
socket.gaierror: [Errno -9] Address family for hostname not supported 

Мой первоначальный сервер не будет двухъядерной машиной, и, следовательно, мне нужно передать файл только через IPv6.

ПРИМЕЧАНИЕ: Когда я использую команду SFTP в Linux, она работает как для ipv4 и ipv6

Любое возможное решение или дополнительные предложения будут действительно оценили

ответ

1

Transport класс Paramiko поддерживает переходящий в объекте сокета а также кортеж. Так что, может быть, попробуйте конкретно перейти в ipv6-сокет?

import socket 

sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) 
sock.connect((hostname, port)) 
transport = paramiko.Transport(sock) 
+0

Здравствуйте, это требует, чтобы метод sock.close() вызывался или автоматически закрывался с помощью transport.close(). –

+0

['Transport.close()'] (https://github.com/paramiko/paramiko/blob/5cc85375ca094b398f20acc9f978b88a6d7a9ef4/paramiko/transport.py#L648) закроет для вас сокет. – csinchok

Смежные вопросы