def download():
if os.path.exists( dst_dir_path ) == False:
logger.error( "Cannot access destination folder %s. Please check path and permissions. " % ( dst_dir_path ))
return 1
elif os.path.isdir( dst_dir_path ) == False:
logger.error( "%s is not a folder. Please check path. " % ( dst_dir_path ))
return 1
file_list = None
#transport = paramiko.Transport(( hostname, port))
paramiko.util.log_to_file('paramiko.log')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#transport
try:
ssh.connect( hostname, username=username, password=password, timeout=5.0)
#transport.connect(username=username, password=password )
except Exception, err:
logger.error( "Failed to connect to the remote server. Reason: %s" % ( str(err) ) )
return 1
try:
#sftp = paramiko.SFTPClient.from_transport(transport)
sftp = ssh.open_sftp()
except Exception, err:
logger.error( "Failed to start SFTP session from connection to %s. Check that SFTP service is running and available. Reason: %s" % ( hostname, str(err) ))
return 1
try:
sftp.chdir(src_dir_path)
#file_list = sftp.listdir(path="%s" % ( src_dir_path ) )
file_list = sftp.listdir()
except Exception, err:
logger.error( "Failed to list files in folder %s. Please check path and permissions. Reason: %s" % ( src_dir_path, str(err) ))
return 1
match_text = re.compile( file_mask )
download_count = 0
for file in file_list:
# Here is an item name... but is it a file or directory?
#logger.info( "Downloading file %s." % ( file ) )
if not re.match( file_mask, file ):
continue
else:
logger.info( "File \"%s\" name matched file mask \"%s\". matches %s.Processing file..." % ( file, file_mask, (match_text.match( file_mask ) ) ) )
src_file_path = "./%s" % ( file )
dst_file_path = "/".join( [ dst_dir_path, file] )
retry_count = 0
while True:
try:
logger.info( "Downloading file %s to %s." % ( file, dst_file_path ) )
#sftp.get( file, dst_file_path, callback=printTotals ) #sftp.get( remote file, local file )
sftp.get( file, dst_file_path) #sftp.get( remote file, local file )
logger.info( "Successfully downloaded file %s to %s." % ( file, dst_file_path ) )
download_count += 1
break
except Exception, err:
if retry_count == retry_threshold:
logger.error( "Failed to download %s to %s. Reason: %s." % ( file, dst_file_path, str(err) ) )
sftp.close()
#transport.close()
return 1
else:
logger.error( "Failed to download %s to %s. Reason: %s." % ( file, dst_file_path, str(err) ) )
retry_count +=1
sftp.close()
transport.close()
logger.info( "%d files downloaded." % ( download_count ) )
return 0
Когда я запускаю функцию ниже, она загружает исходный файл примерно на 3 минуты, а затем закрывает сеанс, хотя загружается только 38-41 МБ (изменяется) файла 1-1.6 ГБ.
Из файла журнала Paramiko, похоже, что соединение SSh остается открытым, пока сеанс SFTP закрывается:
DEB [20120913-10: 05: 00.894] thr = 1 paramiko.transport: переключиться на новые ключи... DEB [20120913-10: 05: 06.953] thr = 1 paramiko.transport: Rekeying (получено 401 пакетов, получено 1053444 байт) DEB [20120913-10: 05: 07.391] thr = 1 paramiko.transport: kex algos: ['diffie-hellman-group1-sha1', 'diffie-hellman-group-exchange-sha1'] ключ сервера: ['ssh- dss '] client encrypt: [' aes256-ctr ',' aes192-ctr ',' aes128-ctr ',' aes256-cbc ',' aes192-cbc ',' aes128-cbc ',' twofish-cbc ',' blowfish-cbc ',' 3des-cbc ',' arcfour '] server encrypt: [' aes256-ctr ',' aes192-ctr ',' aes128-ctr ',' aes256-cbc ',' aes192-cbc ',' Mac OS: "hmac-sha1", "hmac-sha1-96", "hmac-md5", "cfc-cbc", "blowfish-cbc", "3ds-cbc", "arcfour" ], 'hmac-md5-96', '[email protected]'] сервер mac: ['hmac-sha1', 'hmac-sha1-96', 'hmac-md5', 'hmac-md5-96', '[email protected]'] клиент: ['[email protected]', 'zlib', 'none'] серверный сжимать: ['[email protected]', 'zlib', 'none' ] client lang: [''] server lang: [''] kex следует? False DEB [20120913-10: 05: 07.421] thr = 1 paramiko.transport: Чиперы согласились: local = aes128-ctr, remote = aes128-ctr DEB [20120913-10: 05: 07.421] thr = 1 paramiko.transport: использование kex diffie-hellman-group1-sha1; тип ключа сервера ssh-dss; шифр: локальный aes128-ctr, удаленный aes128-ctr; mac: локальный hmac-sha1, удаленный hmac-sha1; сжатие: локальный нет, удаленный нет DEB [20120913-10: 05: 07.625] thr = 1 paramiko.transport: перейти на новые ключи... INF [20120913-10: 05: 10.374] thr = 2 paramiko.transport.sftp: [chan 1] sftp session закрыт. DEB [20120913-10: 05: 10.388] thr = 2 paramiko.transport: [chan 1] EOF отправлено (1)
После этой точки script завершает работу с этим исключением (из блока try/except sftp.get())
Недостаточно ресурсов для завершения запроса
Сама система имеет гигабайты свободного места на диске, так что это не проблема.
Та же самая передача, с которой работает parakmiko, работает отлично с FileZilla и Java-приложением, которые я написал много лет назад для передачи SFTP. Поэтому я думаю, что это проблема с парамико.
Это выполняется в Windows XP и Windows Server 2003.
Я пробовал патчи Paramko 1.17, чтобы он чаще обновлял ключи, но передача все равно бросает исключение. Python 2.7.3 Paramiko 1.7 с патчем Windows 2003 Sevfer
Идеи?
Дополнительная информация: Он терпит неудачу на Windows XP SP3 и Windows 2003, точно такие же поведение и сообщения об ошибках. Информация о sys.version Windows XP Workstation: "2.7.3 (по умолчанию, 10 апреля 2012, 23:31:26) [MSC v.1500 32 бит (Intel)] ' Windows 2003 Server: "2.7.3 (по умолчанию, 10 апреля 2012, 23:31:26) [MSC v.1500 32 бит (Intel)] ' Я заплатил файл packet.py, чтобы сократить время между продлениями ключей. Это не повлияло на поведение sftp.get().