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
以下の関数を実行すると、1〜1.6 GBのファイルのうち38〜41 MB(さまざま)しかダウンロードされていなくても、ソースファイルを約3分間ダウンロードしてから、セッションを閉じます。
Paramikoログファイルから、SFTPセッションが閉じている間、SSh接続は開いたままであるように見えます。
hmac-sha1'、' hmac-sha1-96'、' hmac-md5'、' hmac-md5-96'、' umac-64@openssh.com'] server mac:[' hmac-sha1'、' hmac- sha1-96'、' hmac-md5'、' hmac-md5-96'、' umac-64@openssh.com'] client compress:[' zlib@openssh.com'、' zlib'、' none'] server compress:['zlib@openssh.com'、'zlib'、'none'] client lang:[''] server lang:[''] kex follow?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:kexdiffie-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:[chan1]sftpセッションが閉じられました。DEB [20120913-10:05:10.388] thr = 2 paramiko.transport:[chan 1] EOF送信(1)
この時点以降、スクリプトはこの例外を除いて終了します(sftp.get()try / exceptionブロックから)
リクエストを完了するのに十分なリソースがありません
システム自体にはギガバイトの空きディスク容量があるため、問題はありません。
parakmikoが失敗するのと同じ転送は、FileZillaと、SFTP転送を行うために何年も前に書いたJavaアプリで正常に機能します。ですから、paramikoの問題だと思います。
これは、WindowsXPおよびWindowsServer2003で実行されています。
より頻繁にキーを更新するようにParamko1.17にパッチを適用しようとしましたが、転送によって例外がスローされます。Python 2.7.3Paramiko1.7とパッチWindows2003Sevfer
アイデア?
追加情報:Windows XPSP3およびWindows2003サーバーでは失敗し、まったく同じ動作とエラーメッセージが表示されます。sys.version情報ウィンドウXPワークステーション: '2.7.3(デフォルト、2012年4月10日、23:31:26)[MSC v.1500 32ビット(Intel)]' Windows 2003サーバー: '2.7.3(デフォルト、4月10日) 2012、23:31:26)[MSC v.1500 32ビット(Intel)]'キーの更新間の時間を短縮するためにpacket.pyファイルにパッチを適用しました。sftp.get()の動作には影響しませんでした。