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
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')
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.
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)
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()
© 2022 - 2024 — McMap. All rights reserved.