(最初是在 StackOverflow 上问的,但我认为这里有更合适的专家):
我正在尝试在 python 脚本(在 OSX 10.10 上运行)中从远程 samba 共享(在 Windows 服务器上)传输文件。我可以使用 Finder 的 Go->“连接到服务器 ...”对话框安装共享,但是当我尝试在 python(v 2.7.6)中使用与 pysmb 模块相同的凭据时,我得到“连接被拒绝。 “:
>>> from smb.SMBConnection import SMBConnection
>>> conn =SMBConnection('myuser', 'mypassword','me','remote-server-netbios-name')
>>> assert conn.connect('remoteserver.mycompany.com')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/smb/SMBConnection.py", line 103, in connect
self.sock.connect(( ip, port ))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 61] Connection refused
同样,如果我尝试使用 NetBIOS 包来获取远程服务器的名称(以确认我得到了正确的名称),它就会超时:
>>> from nmb.NetBIOS import NetBIOS
>>>
>>> def getBIOSName(remote_smb_ip, timeout=30):
... try:
... bios = NetBIOS()
... srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
... except:
... print >> sys.stderr, "Looking up timeout, check remote_smb_ip again!!"
... finally:
... bios.close()
... return srv_name
...
>>> getBIOSName('remoteserver.mycompany.com')
相同的代码可以很好地从我家中的 ubuntu 服务器上的 samba 共享中获取文件。我怀疑这可能是服务器本身的一些权限或防火墙问题。关于需要打开哪些端口/权限才能完成这项工作的任何想法?
编辑:根据 boardrider 的建议,我通过指定端口 445 尝试了连接功能。但是,这会产生“对等连接重置”错误:
>>> assert conn.connect('remoteserver.mycompany.com', 445)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/smb/SMBConnection.py", line 112, in connect
self._pollForNetBIOSPacket(timeout)
File "/Library/Python/2.7/site-packages/smb/SMBConnection.py", line 511, in _pollForNetBIOSPacket
d = self.sock.recv(read_len)
socket.error: [Errno 54] Connection reset by peer