re-common 10.0.37__py3-none-any.whl → 10.0.39__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- re_common/baselibrary/__init__.py +4 -4
- re_common/baselibrary/baseabs/__init__.py +6 -6
- re_common/baselibrary/baseabs/baseabs.py +26 -26
- re_common/baselibrary/database/mbuilder.py +132 -132
- re_common/baselibrary/database/moudle.py +93 -93
- re_common/baselibrary/database/msqlite3.py +194 -194
- re_common/baselibrary/database/mysql.py +169 -169
- re_common/baselibrary/database/sql_factory.py +26 -26
- re_common/baselibrary/mthread/MThreadingRun.py +486 -486
- re_common/baselibrary/mthread/MThreadingRunEvent.py +349 -349
- re_common/baselibrary/mthread/__init__.py +2 -2
- re_common/baselibrary/mthread/mythreading.py +695 -695
- re_common/baselibrary/pakge_other/socks.py +404 -404
- re_common/baselibrary/readconfig/config_factory.py +18 -18
- re_common/baselibrary/readconfig/ini_config.py +317 -317
- re_common/baselibrary/readconfig/toml_config.py +49 -49
- re_common/baselibrary/temporary/envdata.py +36 -36
- re_common/baselibrary/tools/all_requests/aiohttp_request.py +118 -118
- re_common/baselibrary/tools/all_requests/httpx_requet.py +102 -102
- re_common/baselibrary/tools/all_requests/mrequest.py +412 -412
- re_common/baselibrary/tools/all_requests/requests_request.py +81 -81
- re_common/baselibrary/tools/batch_compre/bijiao_batch.py +31 -31
- re_common/baselibrary/tools/contrast_db3.py +123 -123
- re_common/baselibrary/tools/copy_file.py +39 -39
- re_common/baselibrary/tools/db3_2_sizedb3.py +102 -102
- re_common/baselibrary/tools/foreachgz.py +39 -39
- re_common/baselibrary/tools/get_attr.py +10 -10
- re_common/baselibrary/tools/image_to_pdf.py +61 -61
- re_common/baselibrary/tools/java_code_deal.py +139 -139
- re_common/baselibrary/tools/javacode.py +79 -79
- re_common/baselibrary/tools/mdb_db3.py +48 -48
- re_common/baselibrary/tools/merge_file.py +171 -171
- re_common/baselibrary/tools/merge_gz_file.py +165 -165
- re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +42 -42
- re_common/baselibrary/tools/mhdfstools/hdfst.py +42 -42
- re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +38 -38
- re_common/baselibrary/tools/mongo_tools.py +50 -50
- re_common/baselibrary/tools/move_file.py +170 -170
- re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +63 -63
- re_common/baselibrary/tools/move_mongo/move_mongo_table.py +354 -354
- re_common/baselibrary/tools/move_mongo/use_mttf.py +18 -18
- re_common/baselibrary/tools/move_mongo/use_mv.py +93 -93
- re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +125 -125
- re_common/baselibrary/tools/mpandas/pandas_visualization.py +7 -7
- re_common/baselibrary/tools/myparsel.py +104 -104
- re_common/baselibrary/tools/rename_dir_file.py +37 -37
- re_common/baselibrary/tools/sequoiadb_utils.py +398 -398
- re_common/baselibrary/tools/split_line_to_many.py +25 -25
- re_common/baselibrary/tools/stringtodicts.py +33 -33
- re_common/baselibrary/tools/workwechant_bot.py +84 -84
- re_common/baselibrary/utils/baseaiohttp.py +296 -296
- re_common/baselibrary/utils/baseaiomysql.py +87 -87
- re_common/baselibrary/utils/baseallstep.py +191 -191
- re_common/baselibrary/utils/baseavro.py +19 -19
- re_common/baselibrary/utils/baseboto3.py +291 -291
- re_common/baselibrary/utils/basecsv.py +32 -32
- re_common/baselibrary/utils/basedict.py +133 -133
- re_common/baselibrary/utils/basedir.py +241 -241
- re_common/baselibrary/utils/baseencode.py +351 -351
- re_common/baselibrary/utils/baseencoding.py +28 -28
- re_common/baselibrary/utils/baseesdsl.py +86 -86
- re_common/baselibrary/utils/baseexcel.py +264 -264
- re_common/baselibrary/utils/baseexcept.py +109 -109
- re_common/baselibrary/utils/basefile.py +654 -654
- re_common/baselibrary/utils/baseftp.py +214 -214
- re_common/baselibrary/utils/basegzip.py +60 -60
- re_common/baselibrary/utils/basehdfs.py +135 -135
- re_common/baselibrary/utils/basehttpx.py +268 -268
- re_common/baselibrary/utils/baseip.py +87 -87
- re_common/baselibrary/utils/basejson.py +2 -2
- re_common/baselibrary/utils/baselist.py +32 -32
- re_common/baselibrary/utils/basemotor.py +190 -190
- re_common/baselibrary/utils/basemssql.py +98 -98
- re_common/baselibrary/utils/baseodbc.py +113 -113
- re_common/baselibrary/utils/basepandas.py +302 -302
- re_common/baselibrary/utils/basepeewee.py +11 -11
- re_common/baselibrary/utils/basepika.py +180 -180
- re_common/baselibrary/utils/basepydash.py +143 -143
- re_common/baselibrary/utils/basepymongo.py +230 -230
- re_common/baselibrary/utils/basequeue.py +22 -22
- re_common/baselibrary/utils/baserar.py +57 -57
- re_common/baselibrary/utils/baserequest.py +279 -279
- re_common/baselibrary/utils/baseset.py +8 -8
- re_common/baselibrary/utils/basesmb.py +403 -403
- re_common/baselibrary/utils/basestring.py +382 -382
- re_common/baselibrary/utils/basetime.py +320 -320
- re_common/baselibrary/utils/baseurl.py +121 -121
- re_common/baselibrary/utils/basezip.py +57 -57
- re_common/baselibrary/utils/core/__init__.py +7 -7
- re_common/baselibrary/utils/core/bottomutils.py +18 -18
- re_common/baselibrary/utils/core/mdeprecated.py +327 -327
- re_common/baselibrary/utils/core/mlamada.py +16 -16
- re_common/baselibrary/utils/core/msginfo.py +25 -25
- re_common/baselibrary/utils/core/requests_core.py +103 -103
- re_common/baselibrary/utils/fateadm.py +429 -429
- re_common/baselibrary/utils/importfun.py +123 -123
- re_common/baselibrary/utils/mfaker.py +57 -57
- re_common/baselibrary/utils/my_abc/__init__.py +3 -3
- re_common/baselibrary/utils/my_abc/better_abc.py +32 -32
- re_common/baselibrary/utils/mylogger.py +414 -414
- re_common/baselibrary/utils/myredisclient.py +861 -861
- re_common/baselibrary/utils/pipupgrade.py +21 -21
- re_common/baselibrary/utils/ringlist.py +85 -85
- re_common/baselibrary/utils/version_compare.py +36 -36
- re_common/baselibrary/utils/ydmhttp.py +126 -126
- re_common/facade/lazy_import.py +11 -11
- re_common/facade/loggerfacade.py +25 -25
- re_common/facade/mysqlfacade.py +467 -467
- re_common/facade/now.py +31 -31
- re_common/facade/sqlite3facade.py +257 -257
- re_common/facade/use/mq_use_facade.py +83 -83
- re_common/facade/use/proxy_use_facade.py +19 -19
- re_common/libtest/base_dict_test.py +19 -19
- re_common/libtest/baseavro_test.py +13 -13
- re_common/libtest/basefile_test.py +14 -14
- re_common/libtest/basemssql_test.py +77 -77
- re_common/libtest/baseodbc_test.py +7 -7
- re_common/libtest/basepandas_test.py +38 -38
- re_common/libtest/get_attr_test/get_attr_test_settings.py +14 -14
- re_common/libtest/get_attr_test/settings.py +54 -54
- re_common/libtest/idencode_test.py +53 -53
- re_common/libtest/iniconfig_test.py +35 -35
- re_common/libtest/ip_test.py +34 -34
- re_common/libtest/merge_file_test.py +20 -20
- re_common/libtest/mfaker_test.py +8 -8
- re_common/libtest/mm3_test.py +31 -31
- re_common/libtest/mylogger_test.py +88 -88
- re_common/libtest/myparsel_test.py +27 -27
- re_common/libtest/mysql_test.py +151 -151
- re_common/libtest/pymongo_test.py +21 -21
- re_common/libtest/split_test.py +11 -11
- re_common/libtest/sqlite3_merge_test.py +5 -5
- re_common/libtest/sqlite3_test.py +34 -34
- re_common/libtest/tomlconfig_test.py +30 -30
- re_common/libtest/use_tools_test/__init__.py +2 -2
- re_common/libtest/user/__init__.py +4 -4
- re_common/studio/__init__.py +4 -4
- re_common/studio/assignment_expressions.py +36 -36
- re_common/studio/mydash/test1.py +18 -18
- re_common/studio/pydashstudio/first.py +9 -9
- re_common/studio/streamlitstudio/first_app.py +65 -65
- re_common/studio/streamlitstudio/uber_pickups.py +23 -23
- re_common/studio/test.py +18 -18
- re_common/v2/baselibrary/business_utils/BusinessStringUtil.py +219 -219
- re_common/v2/baselibrary/business_utils/baseencodeid.py +100 -100
- re_common/v2/baselibrary/business_utils/full_doi_path.py +116 -116
- re_common/v2/baselibrary/business_utils/rel_tools.py +6 -6
- re_common/v2/baselibrary/decorators/utils.py +59 -59
- re_common/v2/baselibrary/helpers/search_packge/NearestNeighbors_test.py +105 -105
- re_common/v2/baselibrary/helpers/search_packge/fit_text_match.py +253 -253
- re_common/v2/baselibrary/helpers/search_packge/scikit_learn_text_matcher.py +260 -260
- re_common/v2/baselibrary/helpers/search_packge/test.py +1 -1
- re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
- re_common/v2/baselibrary/tools/WeChatRobot.py +95 -95
- re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
- re_common/v2/baselibrary/tools/concurrency.py +35 -35
- re_common/v2/baselibrary/tools/data_processer/base.py +53 -53
- re_common/v2/baselibrary/tools/data_processer/data_processer.py +508 -508
- re_common/v2/baselibrary/tools/data_processer/data_reader.py +187 -187
- re_common/v2/baselibrary/tools/data_processer/data_writer.py +38 -38
- re_common/v2/baselibrary/tools/dict_tools.py +44 -44
- re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
- re_common/v2/baselibrary/tools/hdfs_base_processor.py +204 -204
- re_common/v2/baselibrary/tools/hdfs_bulk_processor.py +67 -67
- re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
- re_common/v2/baselibrary/tools/hdfs_line_processor.py +74 -74
- re_common/v2/baselibrary/tools/list_tools.py +69 -69
- re_common/v2/baselibrary/tools/resume_tracker.py +94 -94
- re_common/v2/baselibrary/tools/search_hash_tools.py +54 -54
- re_common/v2/baselibrary/tools/text_matcher.py +326 -326
- re_common/v2/baselibrary/tools/unionfind_tools.py +60 -60
- re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
- re_common/v2/baselibrary/utils/api_net_utils.py +270 -270
- re_common/v2/baselibrary/utils/author_smi.py +361 -361
- re_common/v2/baselibrary/utils/base_string_similarity.py +158 -158
- re_common/v2/baselibrary/utils/basedict.py +37 -37
- re_common/v2/baselibrary/utils/basehdfs.py +163 -163
- re_common/v2/baselibrary/utils/basepika.py +180 -180
- re_common/v2/baselibrary/utils/basetime.py +77 -77
- re_common/v2/baselibrary/utils/db.py +156 -156
- re_common/v2/baselibrary/utils/json_cls.py +16 -16
- re_common/v2/baselibrary/utils/mq.py +83 -83
- re_common/v2/baselibrary/utils/n_ary_expression_tree.py +243 -243
- re_common/v2/baselibrary/utils/string_bool.py +186 -186
- re_common/v2/baselibrary/utils/string_clear.py +246 -246
- re_common/v2/baselibrary/utils/string_smi.py +18 -18
- re_common/v2/baselibrary/utils/stringutils.py +271 -278
- re_common/vip/base_step_process.py +11 -11
- re_common/vip/baseencodeid.py +90 -90
- re_common/vip/changetaskname.py +28 -28
- re_common/vip/core_var.py +24 -24
- re_common/vip/mmh3Hash.py +89 -89
- re_common/vip/proxy/allproxys.py +127 -127
- re_common/vip/proxy/allproxys_thread.py +159 -159
- re_common/vip/proxy/cnki_proxy.py +153 -153
- re_common/vip/proxy/kuaidaili.py +87 -87
- re_common/vip/proxy/proxy_all.py +113 -113
- re_common/vip/proxy/update_kuaidaili_0.py +42 -42
- re_common/vip/proxy/wanfang_proxy.py +152 -152
- re_common/vip/proxy/wp_proxy_all.py +181 -181
- re_common/vip/read_rawid_to_txt.py +91 -91
- re_common/vip/title/__init__.py +5 -5
- re_common/vip/title/transform/TransformBookTitleToZt.py +125 -125
- re_common/vip/title/transform/TransformConferenceTitleToZt.py +139 -139
- re_common/vip/title/transform/TransformCstadTitleToZt.py +195 -195
- re_common/vip/title/transform/TransformJournalTitleToZt.py +203 -203
- re_common/vip/title/transform/TransformPatentTitleToZt.py +132 -132
- re_common/vip/title/transform/TransformRegulationTitleToZt.py +114 -114
- re_common/vip/title/transform/TransformStandardTitleToZt.py +135 -135
- re_common/vip/title/transform/TransformThesisTitleToZt.py +135 -135
- re_common/vip/title/transform/__init__.py +10 -10
- {re_common-10.0.37.dist-info → re_common-10.0.39.dist-info}/LICENSE +201 -201
- {re_common-10.0.37.dist-info → re_common-10.0.39.dist-info}/METADATA +16 -16
- re_common-10.0.39.dist-info/RECORD +248 -0
- {re_common-10.0.37.dist-info → re_common-10.0.39.dist-info}/WHEEL +1 -1
- re_common-10.0.37.dist-info/RECORD +0 -248
- {re_common-10.0.37.dist-info → re_common-10.0.39.dist-info}/top_level.txt +0 -0
|
@@ -1,403 +1,403 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
# @Time : 2020/11/27 16:38
|
|
3
|
-
# @Author : suhong
|
|
4
|
-
# @File : smb_test.py
|
|
5
|
-
# @Software: PyCharm
|
|
6
|
-
# !/usr/local/bin/python3
|
|
7
|
-
import os
|
|
8
|
-
import socket
|
|
9
|
-
import sys
|
|
10
|
-
import traceback
|
|
11
|
-
|
|
12
|
-
import fs.smbfs
|
|
13
|
-
from nmb.NetBIOS import NetBIOS
|
|
14
|
-
from smb import smb_structs
|
|
15
|
-
from smb.SMBConnection import SMBConnection
|
|
16
|
-
from smb.smb_structs import OperationFailure
|
|
17
|
-
|
|
18
|
-
from re_common.baselibrary import IniConfig
|
|
19
|
-
from re_common.baselibrary.utils.basedir import BaseDir
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
# 有的smb使用fs.smbfs无法访问,可以使用smb.SMBConnection
|
|
23
|
-
|
|
24
|
-
class BaseSmb(object):
|
|
25
|
-
"""
|
|
26
|
-
fs.smbfs 建立在 pysmb 之上
|
|
27
|
-
host属性中直接输入ip无效,报错fs.errors.CreateFailed: could not get IP/host pair from '*.*.*.193',
|
|
28
|
-
包的作者目前也没有解决这个问题。加入主机名正常使用
|
|
29
|
-
"""
|
|
30
|
-
|
|
31
|
-
def __init__(self, host=None, username=None, password=None,port=139,domain=""):
|
|
32
|
-
self.conn = None
|
|
33
|
-
self.host = host
|
|
34
|
-
self.username = username
|
|
35
|
-
self.password = password
|
|
36
|
-
self.port = port
|
|
37
|
-
self.domain = domain
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def set_uri(self, uri):
|
|
41
|
-
"""
|
|
42
|
-
'smb://username:password@SAMBAHOSTNAME:port/share'
|
|
43
|
-
由于不知道如何给SAMBAHOSTNAME这个参数,尝试了没有成功
|
|
44
|
-
:return:
|
|
45
|
-
"""
|
|
46
|
-
smb_fs = fs.open_fs(uri)
|
|
47
|
-
return smb_fs
|
|
48
|
-
|
|
49
|
-
def set_default(self):
|
|
50
|
-
"""
|
|
51
|
-
调用该函数默认链接177
|
|
52
|
-
:return:
|
|
53
|
-
"""
|
|
54
|
-
# host必须是(servername,ip),不能只提供ip,servername错误一样有效
|
|
55
|
-
self.host = ("VIPS-001", "192.168.31.184")
|
|
56
|
-
self.username = "caiji_smb_rw"
|
|
57
|
-
self.password = "5joH9yST"
|
|
58
|
-
self.port = 139
|
|
59
|
-
self.domain = ""
|
|
60
|
-
|
|
61
|
-
def set_config(self, path, sesc):
|
|
62
|
-
dictsall = IniConfig(path).builder().get_config_dict()
|
|
63
|
-
dicts = dictsall[sesc]
|
|
64
|
-
self.host = dicts['host']
|
|
65
|
-
self.username = dicts['username']
|
|
66
|
-
self.password = dicts['password']
|
|
67
|
-
self.port = dicts['port']
|
|
68
|
-
self.domain = dicts['domain']
|
|
69
|
-
|
|
70
|
-
def connect(self):
|
|
71
|
-
"""
|
|
72
|
-
设置用户名 密码 进行连接
|
|
73
|
-
:return:
|
|
74
|
-
"""
|
|
75
|
-
self.conn = fs.smbfs.SMBFS(host=self.host, username=self.username,
|
|
76
|
-
passwd=self.password,
|
|
77
|
-
port=self.port,
|
|
78
|
-
domain=self.domain)
|
|
79
|
-
|
|
80
|
-
def close(self):
|
|
81
|
-
# 关闭链接
|
|
82
|
-
self.conn.close()
|
|
83
|
-
|
|
84
|
-
def get_gen_dir(self):
|
|
85
|
-
"""
|
|
86
|
-
获取根目录下的文件名
|
|
87
|
-
:return:
|
|
88
|
-
"""
|
|
89
|
-
for g in self.conn.listdir(""):
|
|
90
|
-
yield g
|
|
91
|
-
|
|
92
|
-
def is_exists(self, pathdir):
|
|
93
|
-
"""
|
|
94
|
-
目录是否存在
|
|
95
|
-
:param sPth:
|
|
96
|
-
:return:
|
|
97
|
-
"""
|
|
98
|
-
return self.conn.exists(pathdir)
|
|
99
|
-
|
|
100
|
-
def is_dir(self, pathdir):
|
|
101
|
-
"""
|
|
102
|
-
是否是目录
|
|
103
|
-
:param sPth:
|
|
104
|
-
:return:
|
|
105
|
-
"""
|
|
106
|
-
return self.conn.isdir(pathdir)
|
|
107
|
-
|
|
108
|
-
def is_file(self, pathfile):
|
|
109
|
-
"""
|
|
110
|
-
是否是文件
|
|
111
|
-
:param sPth:
|
|
112
|
-
:return:
|
|
113
|
-
"""
|
|
114
|
-
return self.conn.isfile(pathfile)
|
|
115
|
-
|
|
116
|
-
def create_dir(self, pathdir):
|
|
117
|
-
"""
|
|
118
|
-
创建目录 该方法可以创建多级目录
|
|
119
|
-
:param pathdir:
|
|
120
|
-
:return:
|
|
121
|
-
"""
|
|
122
|
-
if not self.is_exists(pathdir):
|
|
123
|
-
self.conn.makedirs(pathdir)
|
|
124
|
-
|
|
125
|
-
def get_file_size(self, path):
|
|
126
|
-
"""
|
|
127
|
-
获取文件大小
|
|
128
|
-
:param path:
|
|
129
|
-
:return:
|
|
130
|
-
"""
|
|
131
|
-
size = 0
|
|
132
|
-
size += self.conn.getsize(path)
|
|
133
|
-
return size
|
|
134
|
-
|
|
135
|
-
def download_file(self, srcpath, dstpath):
|
|
136
|
-
"""
|
|
137
|
-
下载smb服务器文件到本地
|
|
138
|
-
:param srcpath:本地文件
|
|
139
|
-
:param dstpath: 服务器文件
|
|
140
|
-
:return:
|
|
141
|
-
"""
|
|
142
|
-
BaseDir.create_dir(srcpath)
|
|
143
|
-
with open(dstpath, 'wb') as write_file:
|
|
144
|
-
self.conn.download(srcpath, write_file)
|
|
145
|
-
|
|
146
|
-
def upload_file(self, srcpath, dstpath):
|
|
147
|
-
"""
|
|
148
|
-
上传本地文件到smb服务器文件
|
|
149
|
-
:param srcpath:本地文件
|
|
150
|
-
:param dstpath: 服务器文件
|
|
151
|
-
:return:
|
|
152
|
-
"""
|
|
153
|
-
self.create_dir(dstpath)
|
|
154
|
-
with open(srcpath, 'rb') as read_file:
|
|
155
|
-
self.conn.upload(dstpath, read_file)
|
|
156
|
-
|
|
157
|
-
def copy_file_to_file_smb(self, filePath, tarPath, overwrite=False):
|
|
158
|
-
"""
|
|
159
|
-
该方法只适合smb服务器地址到smb服务器地址
|
|
160
|
-
:param filePath: 文件路径
|
|
161
|
-
:param tarPath: 输出文件路径
|
|
162
|
-
:return:
|
|
163
|
-
"""
|
|
164
|
-
assert self.is_exists(filePath), FileNotFoundError("需要copy的文件不存在")
|
|
165
|
-
assert self.conn.isfile(filePath), FileNotFoundError("需要copy的不是一个文件")
|
|
166
|
-
|
|
167
|
-
self.conn.copy(filePath, tarPath, overwrite=overwrite)
|
|
168
|
-
|
|
169
|
-
def copy_dir_to_dir_smb(self, oldDir, newDir, moudle=0):
|
|
170
|
-
"""
|
|
171
|
-
该方法只适合smb服务器地址到smb服务器地址
|
|
172
|
-
olddir和newdir都只能是目录,且newdir必须不存在
|
|
173
|
-
:param oldDir:
|
|
174
|
-
:param newDir:
|
|
175
|
-
:return:
|
|
176
|
-
"""
|
|
177
|
-
assert self.is_exists(oldDir), IsADirectoryError(oldDir + "目录不存在")
|
|
178
|
-
assert not self.is_exists(newDir), IsADirectoryError(newDir + "目录存在")
|
|
179
|
-
self.conn.copydir(oldDir, newDir)
|
|
180
|
-
|
|
181
|
-
def move_file_to_file_smb(self, src_path, dst_path, overwrite=False):
|
|
182
|
-
|
|
183
|
-
assert self.is_exists(src_path), FileNotFoundError("需要move的文件不存在")
|
|
184
|
-
assert self.is_file(dst_path), FileNotFoundError("需要move的不是一个文件")
|
|
185
|
-
self.conn.move(src_path, dst_path, overwrite=overwrite)
|
|
186
|
-
|
|
187
|
-
def move_dir_to_dir_smb(self, oldDir, newDir, moudle=0):
|
|
188
|
-
"""
|
|
189
|
-
该方法只适合smb服务器地址到smb服务器地址
|
|
190
|
-
olddir和newdir都只能是目录,且newdir必须不存在
|
|
191
|
-
:param oldDir:
|
|
192
|
-
:param newDir:
|
|
193
|
-
:return:
|
|
194
|
-
"""
|
|
195
|
-
assert self.is_exists(oldDir), IsADirectoryError(oldDir + "目录不存在")
|
|
196
|
-
assert not self.is_exists(newDir), IsADirectoryError(newDir + "目录存在")
|
|
197
|
-
self.conn.movedir(oldDir, newDir)
|
|
198
|
-
|
|
199
|
-
def delete_dir(self, dirpath):
|
|
200
|
-
"""
|
|
201
|
-
递归删除smb服务器文件夹
|
|
202
|
-
:param dirpath:
|
|
203
|
-
:return:
|
|
204
|
-
"""
|
|
205
|
-
assert self.is_file(dirpath), FileExistsError("该目录是个文件")
|
|
206
|
-
|
|
207
|
-
self.conn.removetree(dirpath)
|
|
208
|
-
|
|
209
|
-
def delete_file(self, filepath):
|
|
210
|
-
"""
|
|
211
|
-
删除smb服务器文件
|
|
212
|
-
:param dirpath:
|
|
213
|
-
:return:
|
|
214
|
-
"""
|
|
215
|
-
assert not self.is_file(filepath), FileNotFoundError("该路径不是个文件")
|
|
216
|
-
|
|
217
|
-
self.conn.remove(filepath)
|
|
218
|
-
|
|
219
|
-
def read_file(self, path, mode="r", return_model="yield"):
|
|
220
|
-
"""
|
|
221
|
-
:param mode:
|
|
222
|
-
:param path: caiji/except_client_try.txt
|
|
223
|
-
:return:
|
|
224
|
-
"""
|
|
225
|
-
with self.conn.open(path, mode, encoding="utf-8") as f:
|
|
226
|
-
if return_model == "yield":
|
|
227
|
-
for fLine in f:
|
|
228
|
-
yield fLine.strip()
|
|
229
|
-
if return_model == "all":
|
|
230
|
-
return f.read()
|
|
231
|
-
|
|
232
|
-
def write_file(self, path, value, mode="w"):
|
|
233
|
-
with self.conn.open(path, mode, encoding="utf-8") as f:
|
|
234
|
-
f.write(value)
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
class SmbClient(object):
|
|
238
|
-
"""
|
|
239
|
-
优缺点:函数功能丰富,文件下载功能只对普通文件如txt,dat,csv有效,压缩文件无效
|
|
240
|
-
"""
|
|
241
|
-
|
|
242
|
-
def __init__(self, username, password, my_name, remote_name, ip, port=139, domain='', server_name='caiji'):
|
|
243
|
-
self.username = username
|
|
244
|
-
self.password = password
|
|
245
|
-
self.my_name = my_name
|
|
246
|
-
self.ip = ip
|
|
247
|
-
self.port = port
|
|
248
|
-
self.remote_name = remote_name
|
|
249
|
-
self.conn = None
|
|
250
|
-
self.domain = domain
|
|
251
|
-
self.server_name = server_name
|
|
252
|
-
|
|
253
|
-
def set_use_smb2(self, is_use=True):
|
|
254
|
-
"""
|
|
255
|
-
在 pysmb 中禁用 SMB2 协议,请在创建SMBConnection实例之前将smb_structs模块中
|
|
256
|
-
的SUPPORT_SMB2标志设置为False
|
|
257
|
-
:param is_use:
|
|
258
|
-
:return:
|
|
259
|
-
"""
|
|
260
|
-
smb_structs.SUPPORT_SMB2 = is_use
|
|
261
|
-
|
|
262
|
-
def get_bios_name(self, timeout=10):
|
|
263
|
-
"""
|
|
264
|
-
想通过ip获取对应计算机名,但没有成功
|
|
265
|
-
"""
|
|
266
|
-
bios = None
|
|
267
|
-
try:
|
|
268
|
-
bios = NetBIOS()
|
|
269
|
-
srv_name = bios.queryIPForName(self.ip, timeout=timeout)
|
|
270
|
-
print(srv_name)
|
|
271
|
-
return srv_name
|
|
272
|
-
except:
|
|
273
|
-
traceback.print_exc()
|
|
274
|
-
print(sys.stderr, "Looking up timeout, check remote_smb_ip again!!")
|
|
275
|
-
finally:
|
|
276
|
-
if bios is not None:
|
|
277
|
-
bios.close()
|
|
278
|
-
return []
|
|
279
|
-
|
|
280
|
-
def set_config(self, path, sesc):
|
|
281
|
-
dictsall = IniConfig(path).builder().get_config_dict()
|
|
282
|
-
dicts = dictsall[sesc]
|
|
283
|
-
self.ip = dicts['ip']
|
|
284
|
-
self.port = dicts['port']
|
|
285
|
-
self.username = dicts['username']
|
|
286
|
-
self.password = dicts['password']
|
|
287
|
-
self.my_name = dicts['my_name']
|
|
288
|
-
self.remote_name = dicts['remote_name']
|
|
289
|
-
self.domain = dicts['domain']
|
|
290
|
-
|
|
291
|
-
def connect(self):
|
|
292
|
-
"""
|
|
293
|
-
建立smb服务连接
|
|
294
|
-
port: 445或者139
|
|
295
|
-
:return:
|
|
296
|
-
"""
|
|
297
|
-
try:
|
|
298
|
-
self.conn = SMBConnection(self.username, self.password, self.my_name,
|
|
299
|
-
self.remote_name,
|
|
300
|
-
domain=self.domain)
|
|
301
|
-
self.conn.connect(self.ip, self.port)
|
|
302
|
-
status = self.conn.auth_result
|
|
303
|
-
except:
|
|
304
|
-
self.conn.close()
|
|
305
|
-
status = False
|
|
306
|
-
return status
|
|
307
|
-
|
|
308
|
-
def all_shares_name(self):
|
|
309
|
-
"""
|
|
310
|
-
列出smb服务器下的所有共享目录
|
|
311
|
-
:return:
|
|
312
|
-
"""
|
|
313
|
-
share_names = list()
|
|
314
|
-
sharelist = self.conn.listShares()
|
|
315
|
-
for s in sharelist:
|
|
316
|
-
share_names.append(s.name)
|
|
317
|
-
return share_names
|
|
318
|
-
|
|
319
|
-
def all_file_names_in_dir(self, service_name, dir_name):
|
|
320
|
-
"""
|
|
321
|
-
列出文件夹内所有文件名
|
|
322
|
-
:param service_name: 服务名(smb中的文件夹名,一级目录)
|
|
323
|
-
:param dir_name: 二级目录及以下的文件目录
|
|
324
|
-
:return:
|
|
325
|
-
"""
|
|
326
|
-
f_names = list()
|
|
327
|
-
for e in self.conn.listPath(service_name, dir_name):
|
|
328
|
-
if e.filename[0] != '.': # (会返回一些.的文件,需要过滤)
|
|
329
|
-
f_names.append(e.filename)
|
|
330
|
-
return f_names
|
|
331
|
-
|
|
332
|
-
def get_last_updatetime(self, service_name, file_path):
|
|
333
|
-
'''
|
|
334
|
-
返回samba server上的文件更新时间(时间戳),如果出现OperationFailure说明无此文件,返回0
|
|
335
|
-
:param samba:
|
|
336
|
-
:param service_name:
|
|
337
|
-
:param file_path:
|
|
338
|
-
:return:
|
|
339
|
-
'''
|
|
340
|
-
try:
|
|
341
|
-
sharedfile_obj = self.conn.getAttributes(service_name, file_path)
|
|
342
|
-
return sharedfile_obj.last_write_time
|
|
343
|
-
except OperationFailure:
|
|
344
|
-
return 0
|
|
345
|
-
|
|
346
|
-
def download(self, f_names, service_name, smb_dir, local_dir):
|
|
347
|
-
"""
|
|
348
|
-
下载文件
|
|
349
|
-
:param f_names:文件名
|
|
350
|
-
:param service_name:服务名(smb中的文件夹名)
|
|
351
|
-
:param smb_dir: smb文件夹
|
|
352
|
-
:param local_dir: 本地文件夹
|
|
353
|
-
:return:
|
|
354
|
-
"""
|
|
355
|
-
assert isinstance(f_names, list)
|
|
356
|
-
for f_name in f_names:
|
|
357
|
-
f = open(os.path.join(local_dir, f_name), 'wb')
|
|
358
|
-
self.conn.retrieveFile(service_name, os.path.join(smb_dir, f_name), f)
|
|
359
|
-
f.close()
|
|
360
|
-
|
|
361
|
-
def createDir(self, service_name, path):
|
|
362
|
-
"""
|
|
363
|
-
创建文件夹
|
|
364
|
-
:param samba:
|
|
365
|
-
:param service_name:
|
|
366
|
-
:param path:
|
|
367
|
-
:return:
|
|
368
|
-
"""
|
|
369
|
-
try:
|
|
370
|
-
self.conn.createDirectory(service_name, path)
|
|
371
|
-
except OperationFailure:
|
|
372
|
-
pass
|
|
373
|
-
|
|
374
|
-
def upload(self, service_name, smb_dir, local_dir, f_names):
|
|
375
|
-
"""
|
|
376
|
-
上传文件
|
|
377
|
-
:param samba:
|
|
378
|
-
:param service_name:服务名(smb中的文件夹名)
|
|
379
|
-
:param smb_dir: smb文件夹
|
|
380
|
-
:param local_dir: 本地文件列表所在目录
|
|
381
|
-
:param f_names: 本地文件列表
|
|
382
|
-
:return:
|
|
383
|
-
"""
|
|
384
|
-
assert isinstance(f_names, list)
|
|
385
|
-
for f_name in f_names:
|
|
386
|
-
f = open(os.path.join(local_dir, f_name), 'rb')
|
|
387
|
-
self.conn.storeFile(service_name, os.path.join(smb_dir, f_name), f) # 第二个参数path包含文件全路径
|
|
388
|
-
f.close()
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
# if __name__ == '__main__':
|
|
392
|
-
# bs = BaseSmb()
|
|
393
|
-
# # bs.set_uri("smb://caiji_smb_rw:5joH9yST@('VIPS-001','192.168.31.184'):139/caiji/except_client_try.txt")
|
|
394
|
-
# bs.set_default()
|
|
395
|
-
# bs.connect()
|
|
396
|
-
# bs.write_file("caiji/except_client_try.txt","aaaa")
|
|
397
|
-
# # for i in bs.get_gen_dir():
|
|
398
|
-
# # print(i)
|
|
399
|
-
# # print(bs.delete_dir("down_data/test.txt"))
|
|
400
|
-
|
|
401
|
-
# if __name__ == '__main__':
|
|
402
|
-
# sc = SmbClient("caiji_smb_rw", "5joH9yST", "TEST","VIPS-001", "192.168.31.184", 139, "WorkGroup")
|
|
403
|
-
# sc.connect()
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# @Time : 2020/11/27 16:38
|
|
3
|
+
# @Author : suhong
|
|
4
|
+
# @File : smb_test.py
|
|
5
|
+
# @Software: PyCharm
|
|
6
|
+
# !/usr/local/bin/python3
|
|
7
|
+
import os
|
|
8
|
+
import socket
|
|
9
|
+
import sys
|
|
10
|
+
import traceback
|
|
11
|
+
|
|
12
|
+
import fs.smbfs
|
|
13
|
+
from nmb.NetBIOS import NetBIOS
|
|
14
|
+
from smb import smb_structs
|
|
15
|
+
from smb.SMBConnection import SMBConnection
|
|
16
|
+
from smb.smb_structs import OperationFailure
|
|
17
|
+
|
|
18
|
+
from re_common.baselibrary import IniConfig
|
|
19
|
+
from re_common.baselibrary.utils.basedir import BaseDir
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# 有的smb使用fs.smbfs无法访问,可以使用smb.SMBConnection
|
|
23
|
+
|
|
24
|
+
class BaseSmb(object):
|
|
25
|
+
"""
|
|
26
|
+
fs.smbfs 建立在 pysmb 之上
|
|
27
|
+
host属性中直接输入ip无效,报错fs.errors.CreateFailed: could not get IP/host pair from '*.*.*.193',
|
|
28
|
+
包的作者目前也没有解决这个问题。加入主机名正常使用
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, host=None, username=None, password=None,port=139,domain=""):
|
|
32
|
+
self.conn = None
|
|
33
|
+
self.host = host
|
|
34
|
+
self.username = username
|
|
35
|
+
self.password = password
|
|
36
|
+
self.port = port
|
|
37
|
+
self.domain = domain
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def set_uri(self, uri):
|
|
41
|
+
"""
|
|
42
|
+
'smb://username:password@SAMBAHOSTNAME:port/share'
|
|
43
|
+
由于不知道如何给SAMBAHOSTNAME这个参数,尝试了没有成功
|
|
44
|
+
:return:
|
|
45
|
+
"""
|
|
46
|
+
smb_fs = fs.open_fs(uri)
|
|
47
|
+
return smb_fs
|
|
48
|
+
|
|
49
|
+
def set_default(self):
|
|
50
|
+
"""
|
|
51
|
+
调用该函数默认链接177
|
|
52
|
+
:return:
|
|
53
|
+
"""
|
|
54
|
+
# host必须是(servername,ip),不能只提供ip,servername错误一样有效
|
|
55
|
+
self.host = ("VIPS-001", "192.168.31.184")
|
|
56
|
+
self.username = "caiji_smb_rw"
|
|
57
|
+
self.password = "5joH9yST"
|
|
58
|
+
self.port = 139
|
|
59
|
+
self.domain = ""
|
|
60
|
+
|
|
61
|
+
def set_config(self, path, sesc):
|
|
62
|
+
dictsall = IniConfig(path).builder().get_config_dict()
|
|
63
|
+
dicts = dictsall[sesc]
|
|
64
|
+
self.host = dicts['host']
|
|
65
|
+
self.username = dicts['username']
|
|
66
|
+
self.password = dicts['password']
|
|
67
|
+
self.port = dicts['port']
|
|
68
|
+
self.domain = dicts['domain']
|
|
69
|
+
|
|
70
|
+
def connect(self):
|
|
71
|
+
"""
|
|
72
|
+
设置用户名 密码 进行连接
|
|
73
|
+
:return:
|
|
74
|
+
"""
|
|
75
|
+
self.conn = fs.smbfs.SMBFS(host=self.host, username=self.username,
|
|
76
|
+
passwd=self.password,
|
|
77
|
+
port=self.port,
|
|
78
|
+
domain=self.domain)
|
|
79
|
+
|
|
80
|
+
def close(self):
|
|
81
|
+
# 关闭链接
|
|
82
|
+
self.conn.close()
|
|
83
|
+
|
|
84
|
+
def get_gen_dir(self):
|
|
85
|
+
"""
|
|
86
|
+
获取根目录下的文件名
|
|
87
|
+
:return:
|
|
88
|
+
"""
|
|
89
|
+
for g in self.conn.listdir(""):
|
|
90
|
+
yield g
|
|
91
|
+
|
|
92
|
+
def is_exists(self, pathdir):
|
|
93
|
+
"""
|
|
94
|
+
目录是否存在
|
|
95
|
+
:param sPth:
|
|
96
|
+
:return:
|
|
97
|
+
"""
|
|
98
|
+
return self.conn.exists(pathdir)
|
|
99
|
+
|
|
100
|
+
def is_dir(self, pathdir):
|
|
101
|
+
"""
|
|
102
|
+
是否是目录
|
|
103
|
+
:param sPth:
|
|
104
|
+
:return:
|
|
105
|
+
"""
|
|
106
|
+
return self.conn.isdir(pathdir)
|
|
107
|
+
|
|
108
|
+
def is_file(self, pathfile):
|
|
109
|
+
"""
|
|
110
|
+
是否是文件
|
|
111
|
+
:param sPth:
|
|
112
|
+
:return:
|
|
113
|
+
"""
|
|
114
|
+
return self.conn.isfile(pathfile)
|
|
115
|
+
|
|
116
|
+
def create_dir(self, pathdir):
|
|
117
|
+
"""
|
|
118
|
+
创建目录 该方法可以创建多级目录
|
|
119
|
+
:param pathdir:
|
|
120
|
+
:return:
|
|
121
|
+
"""
|
|
122
|
+
if not self.is_exists(pathdir):
|
|
123
|
+
self.conn.makedirs(pathdir)
|
|
124
|
+
|
|
125
|
+
def get_file_size(self, path):
|
|
126
|
+
"""
|
|
127
|
+
获取文件大小
|
|
128
|
+
:param path:
|
|
129
|
+
:return:
|
|
130
|
+
"""
|
|
131
|
+
size = 0
|
|
132
|
+
size += self.conn.getsize(path)
|
|
133
|
+
return size
|
|
134
|
+
|
|
135
|
+
def download_file(self, srcpath, dstpath):
|
|
136
|
+
"""
|
|
137
|
+
下载smb服务器文件到本地
|
|
138
|
+
:param srcpath:本地文件
|
|
139
|
+
:param dstpath: 服务器文件
|
|
140
|
+
:return:
|
|
141
|
+
"""
|
|
142
|
+
BaseDir.create_dir(srcpath)
|
|
143
|
+
with open(dstpath, 'wb') as write_file:
|
|
144
|
+
self.conn.download(srcpath, write_file)
|
|
145
|
+
|
|
146
|
+
def upload_file(self, srcpath, dstpath):
|
|
147
|
+
"""
|
|
148
|
+
上传本地文件到smb服务器文件
|
|
149
|
+
:param srcpath:本地文件
|
|
150
|
+
:param dstpath: 服务器文件
|
|
151
|
+
:return:
|
|
152
|
+
"""
|
|
153
|
+
self.create_dir(dstpath)
|
|
154
|
+
with open(srcpath, 'rb') as read_file:
|
|
155
|
+
self.conn.upload(dstpath, read_file)
|
|
156
|
+
|
|
157
|
+
def copy_file_to_file_smb(self, filePath, tarPath, overwrite=False):
|
|
158
|
+
"""
|
|
159
|
+
该方法只适合smb服务器地址到smb服务器地址
|
|
160
|
+
:param filePath: 文件路径
|
|
161
|
+
:param tarPath: 输出文件路径
|
|
162
|
+
:return:
|
|
163
|
+
"""
|
|
164
|
+
assert self.is_exists(filePath), FileNotFoundError("需要copy的文件不存在")
|
|
165
|
+
assert self.conn.isfile(filePath), FileNotFoundError("需要copy的不是一个文件")
|
|
166
|
+
|
|
167
|
+
self.conn.copy(filePath, tarPath, overwrite=overwrite)
|
|
168
|
+
|
|
169
|
+
def copy_dir_to_dir_smb(self, oldDir, newDir, moudle=0):
|
|
170
|
+
"""
|
|
171
|
+
该方法只适合smb服务器地址到smb服务器地址
|
|
172
|
+
olddir和newdir都只能是目录,且newdir必须不存在
|
|
173
|
+
:param oldDir:
|
|
174
|
+
:param newDir:
|
|
175
|
+
:return:
|
|
176
|
+
"""
|
|
177
|
+
assert self.is_exists(oldDir), IsADirectoryError(oldDir + "目录不存在")
|
|
178
|
+
assert not self.is_exists(newDir), IsADirectoryError(newDir + "目录存在")
|
|
179
|
+
self.conn.copydir(oldDir, newDir)
|
|
180
|
+
|
|
181
|
+
def move_file_to_file_smb(self, src_path, dst_path, overwrite=False):
|
|
182
|
+
|
|
183
|
+
assert self.is_exists(src_path), FileNotFoundError("需要move的文件不存在")
|
|
184
|
+
assert self.is_file(dst_path), FileNotFoundError("需要move的不是一个文件")
|
|
185
|
+
self.conn.move(src_path, dst_path, overwrite=overwrite)
|
|
186
|
+
|
|
187
|
+
def move_dir_to_dir_smb(self, oldDir, newDir, moudle=0):
|
|
188
|
+
"""
|
|
189
|
+
该方法只适合smb服务器地址到smb服务器地址
|
|
190
|
+
olddir和newdir都只能是目录,且newdir必须不存在
|
|
191
|
+
:param oldDir:
|
|
192
|
+
:param newDir:
|
|
193
|
+
:return:
|
|
194
|
+
"""
|
|
195
|
+
assert self.is_exists(oldDir), IsADirectoryError(oldDir + "目录不存在")
|
|
196
|
+
assert not self.is_exists(newDir), IsADirectoryError(newDir + "目录存在")
|
|
197
|
+
self.conn.movedir(oldDir, newDir)
|
|
198
|
+
|
|
199
|
+
def delete_dir(self, dirpath):
|
|
200
|
+
"""
|
|
201
|
+
递归删除smb服务器文件夹
|
|
202
|
+
:param dirpath:
|
|
203
|
+
:return:
|
|
204
|
+
"""
|
|
205
|
+
assert self.is_file(dirpath), FileExistsError("该目录是个文件")
|
|
206
|
+
|
|
207
|
+
self.conn.removetree(dirpath)
|
|
208
|
+
|
|
209
|
+
def delete_file(self, filepath):
|
|
210
|
+
"""
|
|
211
|
+
删除smb服务器文件
|
|
212
|
+
:param dirpath:
|
|
213
|
+
:return:
|
|
214
|
+
"""
|
|
215
|
+
assert not self.is_file(filepath), FileNotFoundError("该路径不是个文件")
|
|
216
|
+
|
|
217
|
+
self.conn.remove(filepath)
|
|
218
|
+
|
|
219
|
+
def read_file(self, path, mode="r", return_model="yield"):
|
|
220
|
+
"""
|
|
221
|
+
:param mode:
|
|
222
|
+
:param path: caiji/except_client_try.txt
|
|
223
|
+
:return:
|
|
224
|
+
"""
|
|
225
|
+
with self.conn.open(path, mode, encoding="utf-8") as f:
|
|
226
|
+
if return_model == "yield":
|
|
227
|
+
for fLine in f:
|
|
228
|
+
yield fLine.strip()
|
|
229
|
+
if return_model == "all":
|
|
230
|
+
return f.read()
|
|
231
|
+
|
|
232
|
+
def write_file(self, path, value, mode="w"):
|
|
233
|
+
with self.conn.open(path, mode, encoding="utf-8") as f:
|
|
234
|
+
f.write(value)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
class SmbClient(object):
|
|
238
|
+
"""
|
|
239
|
+
优缺点:函数功能丰富,文件下载功能只对普通文件如txt,dat,csv有效,压缩文件无效
|
|
240
|
+
"""
|
|
241
|
+
|
|
242
|
+
def __init__(self, username, password, my_name, remote_name, ip, port=139, domain='', server_name='caiji'):
|
|
243
|
+
self.username = username
|
|
244
|
+
self.password = password
|
|
245
|
+
self.my_name = my_name
|
|
246
|
+
self.ip = ip
|
|
247
|
+
self.port = port
|
|
248
|
+
self.remote_name = remote_name
|
|
249
|
+
self.conn = None
|
|
250
|
+
self.domain = domain
|
|
251
|
+
self.server_name = server_name
|
|
252
|
+
|
|
253
|
+
def set_use_smb2(self, is_use=True):
|
|
254
|
+
"""
|
|
255
|
+
在 pysmb 中禁用 SMB2 协议,请在创建SMBConnection实例之前将smb_structs模块中
|
|
256
|
+
的SUPPORT_SMB2标志设置为False
|
|
257
|
+
:param is_use:
|
|
258
|
+
:return:
|
|
259
|
+
"""
|
|
260
|
+
smb_structs.SUPPORT_SMB2 = is_use
|
|
261
|
+
|
|
262
|
+
def get_bios_name(self, timeout=10):
|
|
263
|
+
"""
|
|
264
|
+
想通过ip获取对应计算机名,但没有成功
|
|
265
|
+
"""
|
|
266
|
+
bios = None
|
|
267
|
+
try:
|
|
268
|
+
bios = NetBIOS()
|
|
269
|
+
srv_name = bios.queryIPForName(self.ip, timeout=timeout)
|
|
270
|
+
print(srv_name)
|
|
271
|
+
return srv_name
|
|
272
|
+
except:
|
|
273
|
+
traceback.print_exc()
|
|
274
|
+
print(sys.stderr, "Looking up timeout, check remote_smb_ip again!!")
|
|
275
|
+
finally:
|
|
276
|
+
if bios is not None:
|
|
277
|
+
bios.close()
|
|
278
|
+
return []
|
|
279
|
+
|
|
280
|
+
def set_config(self, path, sesc):
|
|
281
|
+
dictsall = IniConfig(path).builder().get_config_dict()
|
|
282
|
+
dicts = dictsall[sesc]
|
|
283
|
+
self.ip = dicts['ip']
|
|
284
|
+
self.port = dicts['port']
|
|
285
|
+
self.username = dicts['username']
|
|
286
|
+
self.password = dicts['password']
|
|
287
|
+
self.my_name = dicts['my_name']
|
|
288
|
+
self.remote_name = dicts['remote_name']
|
|
289
|
+
self.domain = dicts['domain']
|
|
290
|
+
|
|
291
|
+
def connect(self):
|
|
292
|
+
"""
|
|
293
|
+
建立smb服务连接
|
|
294
|
+
port: 445或者139
|
|
295
|
+
:return:
|
|
296
|
+
"""
|
|
297
|
+
try:
|
|
298
|
+
self.conn = SMBConnection(self.username, self.password, self.my_name,
|
|
299
|
+
self.remote_name,
|
|
300
|
+
domain=self.domain)
|
|
301
|
+
self.conn.connect(self.ip, self.port)
|
|
302
|
+
status = self.conn.auth_result
|
|
303
|
+
except:
|
|
304
|
+
self.conn.close()
|
|
305
|
+
status = False
|
|
306
|
+
return status
|
|
307
|
+
|
|
308
|
+
def all_shares_name(self):
|
|
309
|
+
"""
|
|
310
|
+
列出smb服务器下的所有共享目录
|
|
311
|
+
:return:
|
|
312
|
+
"""
|
|
313
|
+
share_names = list()
|
|
314
|
+
sharelist = self.conn.listShares()
|
|
315
|
+
for s in sharelist:
|
|
316
|
+
share_names.append(s.name)
|
|
317
|
+
return share_names
|
|
318
|
+
|
|
319
|
+
def all_file_names_in_dir(self, service_name, dir_name):
|
|
320
|
+
"""
|
|
321
|
+
列出文件夹内所有文件名
|
|
322
|
+
:param service_name: 服务名(smb中的文件夹名,一级目录)
|
|
323
|
+
:param dir_name: 二级目录及以下的文件目录
|
|
324
|
+
:return:
|
|
325
|
+
"""
|
|
326
|
+
f_names = list()
|
|
327
|
+
for e in self.conn.listPath(service_name, dir_name):
|
|
328
|
+
if e.filename[0] != '.': # (会返回一些.的文件,需要过滤)
|
|
329
|
+
f_names.append(e.filename)
|
|
330
|
+
return f_names
|
|
331
|
+
|
|
332
|
+
def get_last_updatetime(self, service_name, file_path):
|
|
333
|
+
'''
|
|
334
|
+
返回samba server上的文件更新时间(时间戳),如果出现OperationFailure说明无此文件,返回0
|
|
335
|
+
:param samba:
|
|
336
|
+
:param service_name:
|
|
337
|
+
:param file_path:
|
|
338
|
+
:return:
|
|
339
|
+
'''
|
|
340
|
+
try:
|
|
341
|
+
sharedfile_obj = self.conn.getAttributes(service_name, file_path)
|
|
342
|
+
return sharedfile_obj.last_write_time
|
|
343
|
+
except OperationFailure:
|
|
344
|
+
return 0
|
|
345
|
+
|
|
346
|
+
def download(self, f_names, service_name, smb_dir, local_dir):
|
|
347
|
+
"""
|
|
348
|
+
下载文件
|
|
349
|
+
:param f_names:文件名
|
|
350
|
+
:param service_name:服务名(smb中的文件夹名)
|
|
351
|
+
:param smb_dir: smb文件夹
|
|
352
|
+
:param local_dir: 本地文件夹
|
|
353
|
+
:return:
|
|
354
|
+
"""
|
|
355
|
+
assert isinstance(f_names, list)
|
|
356
|
+
for f_name in f_names:
|
|
357
|
+
f = open(os.path.join(local_dir, f_name), 'wb')
|
|
358
|
+
self.conn.retrieveFile(service_name, os.path.join(smb_dir, f_name), f)
|
|
359
|
+
f.close()
|
|
360
|
+
|
|
361
|
+
def createDir(self, service_name, path):
|
|
362
|
+
"""
|
|
363
|
+
创建文件夹
|
|
364
|
+
:param samba:
|
|
365
|
+
:param service_name:
|
|
366
|
+
:param path:
|
|
367
|
+
:return:
|
|
368
|
+
"""
|
|
369
|
+
try:
|
|
370
|
+
self.conn.createDirectory(service_name, path)
|
|
371
|
+
except OperationFailure:
|
|
372
|
+
pass
|
|
373
|
+
|
|
374
|
+
def upload(self, service_name, smb_dir, local_dir, f_names):
|
|
375
|
+
"""
|
|
376
|
+
上传文件
|
|
377
|
+
:param samba:
|
|
378
|
+
:param service_name:服务名(smb中的文件夹名)
|
|
379
|
+
:param smb_dir: smb文件夹
|
|
380
|
+
:param local_dir: 本地文件列表所在目录
|
|
381
|
+
:param f_names: 本地文件列表
|
|
382
|
+
:return:
|
|
383
|
+
"""
|
|
384
|
+
assert isinstance(f_names, list)
|
|
385
|
+
for f_name in f_names:
|
|
386
|
+
f = open(os.path.join(local_dir, f_name), 'rb')
|
|
387
|
+
self.conn.storeFile(service_name, os.path.join(smb_dir, f_name), f) # 第二个参数path包含文件全路径
|
|
388
|
+
f.close()
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
# if __name__ == '__main__':
|
|
392
|
+
# bs = BaseSmb()
|
|
393
|
+
# # bs.set_uri("smb://caiji_smb_rw:5joH9yST@('VIPS-001','192.168.31.184'):139/caiji/except_client_try.txt")
|
|
394
|
+
# bs.set_default()
|
|
395
|
+
# bs.connect()
|
|
396
|
+
# bs.write_file("caiji/except_client_try.txt","aaaa")
|
|
397
|
+
# # for i in bs.get_gen_dir():
|
|
398
|
+
# # print(i)
|
|
399
|
+
# # print(bs.delete_dir("down_data/test.txt"))
|
|
400
|
+
|
|
401
|
+
# if __name__ == '__main__':
|
|
402
|
+
# sc = SmbClient("caiji_smb_rw", "5joH9yST", "TEST","VIPS-001", "192.168.31.184", 139, "WorkGroup")
|
|
403
|
+
# sc.connect()
|