Python 从linux到Windows的pysmb,无法连接到共享设备

Python 从linux到Windows的pysmb,无法连接到共享设备,python,pysmb,Python,Pysmb,试图通过pysmb连接到smb共享,但出现错误 smb.smb_structs.OperationFailure: Failed to list on \\\\H021BSBD20\\shared_folder: Unable to connect to shared device 我正在使用的代码看起来像 从smb.SMBConnection导入SMBConnection 导入json 导入pprint 进口警告 pp=pprint.预印机(缩进=4) PROJECT_HOME=“/pat

试图通过
pysmb
连接到smb共享,但出现错误

smb.smb_structs.OperationFailure: Failed to list  on \\\\H021BSBD20\\shared_folder: Unable to connect to shared device
我正在使用的代码看起来像

从smb.SMBConnection导入SMBConnection
导入json
导入pprint
进口警告
pp=pprint.预印机(缩进=4)
PROJECT_HOME=“/path/to/my/PROJECT/”
#加载配置
CONF=json.load(打开(f“{PROJECT_HOME}/configs/configs.json”))
pp.pprint(CONF)
#列出存储smb目录中的所有文件
#https://pysmb.readthedocs.io/en/latest/api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listPath
是\u DIRECT\u TCP=False吗
CNXN_端口=139如果不是,则为\u直接\u TCP else 445
本地_IP=“172.18.4.69”
REMOTE_NAME=“H021BSBD20”#确切名称在系统设置中显示为设备名称
服务\u名称=“\\\\H021BSBD20\\shared\u文件夹”
远程_IP=“172.18.7.102”
尝试:
conn=SMBConnection(CONF['smb\u creds']['username'],CONF['smb\u creds']['password'],
我的\u名称=本地\u IP,远程\u名称=远程\u名称,
使用\u ntlm\u v2=True,
is_direct_tcp=is_direct_tcp)
连接(远程IP、CNXN端口)
除例外情况外:
warnings.warn(“\n\n初始连接失败,再次尝试使用参数use\u ntlm\u v2=False\n\n”)
conn=SMBConnection(CONF['smb\u creds']['username'],CONF['smb\u creds']['password'],
我的\u名称=本地\u IP,远程\u名称=远程\u名称,
使用\u ntlm\u v2=False,
is_direct_tcp=is_direct_tcp)
连接(远程IP、CNXN端口)
files=conn.listPath(f'{SERVICE\u NAME}','\\')
pp.pprint(文件)
在我的计算机上使用
smbclient
,我可以通过执行以下操作成功连接到共享

[root@airflowetletl]#smbclient-U我的用户\\\\H021BSBD20\\shared_文件夹
我在python代码中使用的反斜杠的数量是这样的,这样我就可以创建使用此
smbclient
时可以使用的相同字符串(我尝试过在代码中使用较少的反斜杠,但没有帮助)

请注意,我使用python代码中的access the shared folder(访问共享文件夹)和
smbclient
的用户无法访问/登录到共享所在的实际计算机(仅允许他们访问特定的共享文件夹,如上所示)


有人知道这里会发生什么吗?还有什么调试步骤可以完成吗?

在github repo Issues部分()上询问之后,我能够解决这个问题。这是因为我使用的参数是
conn.listPath()
servicename
参数

当仔细查看该函数()的文档时,我看到

服务名称(字符串/unicode)–路径的共享文件夹的名称

最初,我只是查看函数签名,上面写着
service\u name
,因此我假设它与
smbclient
命令行工具相同(我已经将
servicename
参数输入为
\\\\devicename\\sharename
(与
pysmb
不同,我们可以从docstring中看到,pysmb只希望共享作为服务名称)

所以而不是

files=conn.listPath(\\\\H021BSBD20\\shared\u文件夹,“\\”)
我知道

files=conn.listPath(“共享\u文件夹”、“\\”)
下面显示了完整的重构代码段,仅供参考

import argparse
导入json
导入操作系统
导入pprint
导入套接字
导入系统
导入回溯
进口警告
从smb.SMBConnection导入SMBConnection
def parseArguments():
#创建参数解析器
parser=argparse.ArgumentParser()
#位置强制参数
parser.add_参数(“project_home”,help=“project home path”,type=str)
parser.add_参数(“device_name”,help=“要处理的共享配置中的设备(例如NetBIOS)名称”,type=str)
#可选参数
#parser.add_参数(“-dfd”,“--data_file_dir”,
#help=“要推送到接收器的数据文件目录的路径,或者基于表单类型的源列”,
#类型=str,默认值=无)
#解析参数
args=parser.parse_args()
返回参数
args=parseArguments()
对于参数中的a。\uuuu dict\uuuuu:
打印(str(a)+“:”+str(args.\u dict\u[a]))
pp=pprint.预印机(缩进=4)
PROJECT\u HOME=args.PROJECT\u HOME
远程\u名称=args.device\u名称
#加载配置
CONF=json.load(打开(f“{PROJECT_HOME}/configs/configs.json”))
CREDS=json.load(打开(f“{PROJECT_HOME}/configs/CREDS.json”))
pp.pprint(CONF)
SMB\u CONFS=next(如果信息[“设备名称”]==args.device\u name,则在CONF[“SMB\u服务器配置”]中提供信息的信息)
打印(“\n使用设备的详细信息:”)
pp.pprint(SMB\U会议)
#列出存储smb目录中的所有文件
#https://pysmb.readthedocs.io/en/latest/api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listPath
是\u DIRECT\u TCP=False吗
CNXN_端口=139如果是直接的,则TCP为假,否则445
LOCAL_IP=socket.gethostname()#“172.18.4.69”
远程\u名称=SMB\u通信[“设备\u名称”]
SHARE\u FOLDER=SMB\u CONFS[“SHARE\u FOLDER”]
REMOTE_IP=socket.gethostbyname(REMOTE_NAME)#“172.18.7.102”
打印(本地IP)
打印(远程名称)
尝试:
conn=SMBConnection(CREDS['smb\u CREDS']['username'],CREDS['smb\u CREDS']['password'],
我的\u名称=本地\u IP,远程\u名称=远程\u名称,
使用\u ntlm\u v2=False,
is_direct_tcp=is_direct_tcp)
连接(远程IP、CNXN端口)
除例外情况外:
traceback.print_exc()
warnings.warn(“\n\n初始连接失败,再次尝试使用参数use\u ntlm\u v2=True\n\n”)
conn=SMBConnection(CREDS['smb\u CREDS']['username'],CREDS['smb\u CREDS']['password'],
我的\u名称=本地\u IP,远程\u名称=远程\u名称,
使用\u ntlm\u v2=True,
is_direct_tcp=is_direct_tcp)
连接(远程IP、CNXN端口)
files=conn.listPath(共享文件夹“\\”)
如果len(文件)>0:
打印(“找到列出的文件”)