Could you give me an example of using pysmb library to connect to some samba server? I've read there's class smb.SMBConnection.SMBConnection(username, password, my_name, remote_name, domain='', use_ntlm_v2=True) but i can't figure out how to use it
4 Answers
I have been using pysmb for network shares enumeration lately, and found that it is not so easy to find good / complete examples. I'd refer you to a small script that I wrote for enumerating smb shares with pysmb: https://github.com/n3if/scripts/tree/master/smb_enumerator
For the sake of completeness, also, I post here the code snippet that accomplishes the connection and enumeration:
from smb import SMBConnection
try:
conn = SMBConnection(username,password,'name',system_name,domain,use_ntlm_v2=True,
sign_options=SMBConnection.SIGN_WHEN_SUPPORTED,
is_direct_tcp=True)
connected = conn.connect(system_name,445)
try:
Response = conn.listShares(timeout=30) # obtain a list of shares
print('Shares on: ' + system_name)
for i in range(len(Response)): # iterate through the list of shares
print(" Share[",i,"] =", Response[i].name)
try:
# list the files on each share
Response2 = conn.listPath(Response[i].name,'/',timeout=30)
print(' Files on: ' + system_name + '/' + " Share[",i,"] =",
Response[i].name)
for i in range(len(Response2)):
print(" File[",i,"] =", Response2[i].filename)
except:
print('### can not access the resource')
except:
print('### can not list shares')
except:
print('### can not access the system')

- 5,414
- 6
- 40
- 72

- 480
- 7
- 13
-
1What if samba server has a 'GUEST' login. what to provide for username and password field in that case? – user2033758 May 03 '16 at 16:46
-
1I'd say User=GUEST and Password='' but I should try it. – neif May 03 '16 at 16:51
The SMBConnection class will allow you to access the files on the remote Samba server in blocking mode.
To retrieve the list of the files in a shared folder on the remote server,
from smb.SMBConnection import SMBConnection
conn = SMBConnection(userid, password, client_machine_name, remote_machine_name, use_ntlm_v2 = True)
conn.connect(server_ip, 139)
filelist = conn.listPath('shared_folder_name', '/')
The returned filelist will be a list of SharedFile
instances.
More examples can be found in the tests/SMBConnectionTests
folder in the pysmb source package.
-
6Thanks. What are the client_machine_name, and remote_machine_name variables even supposed to look like? Which part of the address do I use? do I include "smb://" in the remote name? – hendrixski May 16 '16 at 16:41
For example you want to store a file via pysmb same as this:
from smb.SMBConnection import SMBConnection
file_obj = open('image.png', 'rb')
connection = SMBConnection(username=username,
password=password,
remote_name=remote_name, # It's net bios name
domain=domain,
use_ntlm_v2=True)
connection.connect(ip=host) # The IP of file server
connection.storeFile(service_name=service_name, # It's the name of shared folder
path=path,
file_obj=file_obj)
connection.close()

- 31
- 1
- 2
I had a challenging time figuring out how to use pysmb
module, but managed to get it working.
I'm using Python 3.10.15 on Windows 10 64-bit, using pysmb
to connect to a network share within an enterprise domain. For my example, assume the following network share path using full UNC
notation:
\\SHARENAME\RootDirectory\Subdirectory
Somethings to consider when using the SMBConnection Class
:
my_name
string can be anything, even blank""
. I usedsocket.gethostname()
remote_name
string must be the hostname of the network share (ie:SHARENAME
from above example)ip
string can be the network share's IP address (such as usingsocket.gethostbyname("SHARENAME")
or the same name used forremote_name
service_name
string is a root directory underremote_name
(ie:RootDirectory
from above example)path
string is the subdirectories underservice_name
(ie:Subdirectory
from above example.path
string can contain\\
or/
to signify a subdirectory. You can even use it mixed (ex:\\Subdirectory/SubSubdirectory
)
See SharedFile Class for a list of attributes that is available when using listPath()
from smb.base import SharedFile
from smb.SMBConnection import SMBConnection
listSharedFileObj = []
# Using context manager to automatically close connection with code block finishes
with SMBConnection("username", "password", "my_name", "remote_name", "MYDOMAIN") as smbconn:
# "You must call this method before attempting any of the file operations with the remote server."
# https://pysmb.readthedocs.io/en/latest/api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.connect
smbconn.connect("IP address or remote_name")
# Returns: A list of "smb.base.SharedFile" instances
# https://pysmb.readthedocs.io/en/latest/api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listPath
listSharedFileObj = smbconn.listPath("ROOTDIRECTORY", "/Subdirectory/SubSubdirectory")
# Pre annotate for type-hinting SharedFile object
item: SharedFile
for item in listSharedFileObj:
print(item.filename)

- 779
- 8
- 16