(первоначально спросил на StackOverflow, но я думаю, что есть более подходящие специалисты здесь):Что может привести к сбою pysmb при успешном выполнении OSX Finder «Подключение к серверу ...»?
Я пытаюсь передать файл из доли удаленного самбы (на сервере Windows) в питон скрипт (работает на OSX 10,10). Я могу установить общий ресурс, используя диалог Goer -> «Connect to Server ...» Finder, но когда я пытаюсь использовать те же учетные данные с модулем pysmb в python (v 2.7.6), я получаю «Connection Refused». «:
>>> 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')
То же код отлично работает, чтобы получать файлы из общей папки samba на моем сервере ubuntu дома. Я подозреваю, что могут быть некоторые разрешения или проблемы с брандмауэром на самом сервере. Любые идеи о том, какие порты/разрешения необходимо открыть, чтобы сделать эту работу?
EDIT: С предложением 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
В документации дается 'conn.connect (server_ip, 139)', поэтому, возможно, порт, который вы используете в скрипте, неверен. Также, как и Windows 2000, SMB работает по умолчанию с тонким слоем, похожим на пакет сообщений сеанса службы сеансов NBT, поверх TCP, используя TCP-порт 445, а не TCP-порт 139, - функцию, известную как «SMB с прямым хостом» "._ – boardrider
Спасибо за подсказку. Я изначально указал 139 явно, но это не имело никакого значения, поэтому я попытался использовать значение по умолчанию. Тем не менее, оба результата «Соединение отказались» выше. Когда я попробовал это с 445, у меня был другой результат. Я обновлю свой вопрос выше, поскольку он более разборчив, чем результат в этом комментарии. –