smbclient Command in Linux

Introduction to Linux smbclient for SMB/CIFS Share Access

In this tutorial, we will delve into the Linux smbclient command and its practical uses for systemadmin tasks. The smbclient utility is a versatile tool enabling Linux systems to interact seamlessly with Windows file shares, also known as SMB/CIFS shares. SMB (Server Message Block) is a network protocol fundamental to Windows for file sharing, and smbclient empowers Linux users to access and manage these shares effectively.

Our journey begins with installing smbclient on an Ubuntu 22.04 system. We'll then cover the core syntax of the command, followed by demonstrations on connecting to Windows shares, navigating through directories, and performing file transfers between Linux and Windows environments.

Upon completing this tutorial, you will possess the skills to:

  • Install and properly configure the smbclient utility on your Linux system
  • Establish connections to Windows shares directly from Linux
  • Effortlessly navigate and list files residing on Windows shares
  • Execute file transfers between Linux and Windows systems, ensuring data accessibility across platforms

Installing smbclient on Ubuntu 22.04: A Step-by-Step Guide

The smbclient package provides a command-line interface that allows Linux systems to interact with SMB/CIFS file shares, widely prevalent in Windows environments. In this segment, we'll walk you through the installation process on your Ubuntu system.

First, let's update the package index to ensure we're working with the latest available versions:

sudo apt update

You should see output similar to this:

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [114 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB]
Fetched 324 kB in 1s (324 kB/s)
Reading package lists... Done

Next, proceed to install the smbclient package using the following command:

sudo apt install -y smbclient

The output will look something like this:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libsmbclient
Suggested packages:
  samba-common
The following NEW packages will be installed:
  libsmbclient smbclient
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 479 kB of archives.
After this operation, 1,711 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 libsmbclient amd64 2:4.15.5+dfsg-1ubuntu2 [222 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 smbclient amd64 2:4.15.5+dfsg-1ubuntu2 [257 kB]
Fetched 479 kB in 0s (1,030 kB/s)
Selecting previously unselected package libsmbclient.
(Reading database ... 26536 files and directories currently installed.)
Preparing to unpack .../libsmbclient_2%3a4.15.5+dfsg-1ubuntu2_amd64.deb ...
Unpacking libsmbclient (2:4.15.5+dfsg-1ubuntu2) ...
Selecting previously unselected package smbclient.
Preparing to unpack .../smbclient_2%3a4.15.5+dfsg-1ubuntu2_amd64.deb ...
Unpacking smbclient (2:4.15.5+dfsg-1ubuntu2) ...
Setting up libsmbclient (2:4.15.5+dfsg-1ubuntu2) ...
Setting up smbclient (2:4.15.5+dfsg-1ubuntu2) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3) ...

To confirm a successful installation of smbclient, execute the following command:

smbclient --version

The output should reveal the version of smbclient that has been installed:

Version 4.15.5-Ubuntu

With smbclient successfully installed, we can now proceed to utilize it for interacting with SMB/CIFS shares.

Understanding smbclient Essentials: Syntax and Usage

Having installed smbclient, it's crucial to grasp its fundamental usage and syntax before attempting to connect to live SMB shares.

Command Syntax Explained

The basic structure of the smbclient command is as follows:

smbclient //server/share -U username%password [options]

Key elements defined:

  • //server/share represents the UNC (Universal Naming Convention) path pointing to the desired SMB share
  • -U username%password specifies the username and password required for authentication purposes
  • [options] allows for the inclusion of supplementary parameters to customize the connection

Local Directory Setup for Hands-On Practice

Let's establish a dedicated directory to house files intended for transfer to or from SMB shares:

mkdir -p ~/project/smb-files

Next, let's populate this directory with a sample file for demonstration purposes:

echo "This is a test file for SMB transfer" > ~/project/smb-files/test.txt

Exploring smbclient Help Resources

To uncover the complete range of options available within smbclient, invoke the help command:

smbclient --help

This will generate an extensive help document outlining all supported options. A snippet of the expected output:

Usage: smbclient [OPTION...] service <password>
  -M, --message=HOST                           Send message
  -I, --ip-address=IP                          Use this IP to connect to
  -E, --stderr                                 Write messages to stderr instead of stdout
  -L, --list=HOST                              Get a list of shares available on a host
  -T, --tar=<c|x>IXFvgbNan                     Command line tar
  -D, --directory=DIR                          Start from directory
...

Essential smbclient Commands for System Administrators

Once connected to an SMB share using smbclient, you can leverage a suite of commands to navigate and manipulate files effectively. Here's a selection of frequently used commands:

  • ls or dir: View the list of files and directories within the current location
  • cd directory: Move to a different directory
  • get file [localfile]: Retrieve a file from the share, optionally specifying a local name
  • put file [remotefile]: Upload a file to the share, with the option to rename it on the remote side
  • mget files...: Download multiple files simultaneously
  • mput files...: Upload multiple files in a single operation
  • mkdir directory: Create a new directory on the share
  • rmdir directory: Remove an existing directory
  • rm file: Delete a file
  • help or ?: Access detailed help information
  • quit or exit: Terminate the smbclient session

With a firm understanding of smbclient basics, the next step involves connecting to an actual SMB share.

Creating a Test SMB Environment for System Administration Training

In realistic scenarios, you'd connect to either a Windows server or a Samba server. However, to facilitate this learning experience, we'll simulate an SMB environment using a local Samba server, granting us the freedom to practice smbclient commands without needing external server access.

Samba Server Installation Guide

Begin by installing the Samba server package:

sudo apt install -y samba

Observe the output as it indicates the installation's progress:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  attr python3-dnspython python3-gpg python3-ldb python3-markdown python3-pygments python3-samba samba-common samba-common-bin samba-dsdb-modules samba-libs samba-vfs-modules tdb-tools
Suggested packages:
  bind9 bind9utils ctdb ldb-tools ntp | chrony python-markdown-doc python-pygments-doc
The following NEW packages will be installed:
  attr python3-dnspython python3-gpg python3-ldb python3-markdown python3-pygments python3-samba samba samba-common samba-common-bin samba-dsdb-modules samba-libs samba-vfs-modules tdb-tools
0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.1 MB of archives.
After this operation, 51.3 MB of additional disk space will be used.
...

Configuring a Samba Share for Practice

Now, let's construct a basic Samba share configuration. First, back up the default configuration file:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup

Create a directory specifically for sharing:

mkdir -p ~/project/samba-share

Place a test file within this shared directory:

echo "This is a test file in our Samba share" > ~/project/samba-share/shared-test.txt

Next, let's formulate a streamlined Samba configuration:

sudo bash -c 'cat > /etc/samba/smb.conf << EOF
[global]
   workgroup = WORKGROUP
   server string = Samba Server
   log file = /var/log/samba/log.%m
   max log size = 50
   security = user
   map to guest = bad user

[testshare]
   path = /home/labex/project/samba-share
   browseable = yes
   read only = no
   guest ok = yes
   force user = labex
EOF'

Add the current user to the Samba user database and assign a password for testing purposes:

sudo smbpasswd -a labex

At the prompt, enter a straightforward password like password (confirm by typing it twice):

New SMB password:
Retype new SMB password:
Added user labex.

Restart the Samba service to enact the changes:

sudo service smbd restart

With this configuration, we now have a local Samba share named testshare ready for interaction, effectively simulating a remote Windows share for our smbclient exercises.

Connecting to SMB Shares with smbclient: A Practical Guide

With our test SMB environment in place, we're prepared to establish a connection to the share via smbclient.

Listing Available Shares on the Network

First, let's identify the available shares on the local machine:

smbclient -L localhost -U labex

When prompted, provide the password you established for the Samba user (e.g., password):

Enter WORKGROUP\labex's password:

Expect output mirroring the following:

        Sharename       Type      Comment
        ---------       ----      -------
        testshare       Disk
        IPC$            IPC       IPC Service (Samba Server)
Reconnecting with SMB1 for workgroup listing.

        Server               Comment
        ---------            -------
        UBUNTU               Samba Server

        Workgroup            Master
        ---------            -------
        WORKGROUP            UBUNTU

The output confirms the presence of our newly created testshare share.

Establishing a Connection to the Share

Now, let's directly connect to the testshare share:

smbclient //localhost/testshare -U labex

Enter the required password when requested:

Enter WORKGROUP\labex's password:

A successful connection will result in the smbclient prompt:

Try "help" to get a list of possible commands.
smb: \>

Navigating and Managing Files on the Share

Having established the connection, let's explore fundamental commands:

To view files within the current directory:

smb: \> ls

The output should display the test file we previously created:

  .                                   D        0  Tue Nov 30 12:00:00 2022
  ..                                  D        0  Tue Nov 30 12:00:00 2022
  shared-test.txt                     N       37  Tue Nov 30 12:00:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

Creating a Remote Directory on the SMB Share

Let's add a new directory to the SMB share:

smb: \> mkdir test-directory

Re-list the contents to verify the directory's creation:

smb: \> ls

You should now see the newly created directory in the listing:

  .                                   D        0  Tue Nov 30 12:01:00 2022
  ..                                  D        0  Tue Nov 30 12:00:00 2022
  shared-test.txt                     N       37  Tue Nov 30 12:00:00 2022
  test-directory                      D        0  Tue Nov 30 12:01:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

Changing the Current Directory

Let's navigate into the newly created directory:

smb: \> cd test-directory

Confirm that you're in the new directory:

smb: \test-directory\> ls

The output should indicate an empty directory:

  .                                   D        0  Tue Nov 30 12:01:00 2022
  ..                                  D        0  Tue Nov 30 12:01:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

To revert to the parent directory:

smb: \test-directory\> cd ..

Accessing Help Information Inside smbclient

To view a comprehensive list of available commands within smbclient, use:

smb: \> help

A complete listing of available commands will be displayed:

?              allinfo        altname        archive        backup
blocksize      cancel         case_sensitive cd             chmod
chown          close          del            dir            du
echo           exit           get            getfacl        geteas
hardlink       help           history        iosize         lcd
link           lock           lowercase      ls             l
mask           md             mget           mkdir          more
mput           newer          notify         open           posix
posix_encrypt  posix_open     posix_mkdir    posix_rmdir    posix_unlink
print          prompt         put            pwd            q
queue          quit           readlink       rd             recurse
reget          rename         reput          rm             rmdir
showacls       setea          setmode        stat           symlink
tar            tarmode        timeout        translate      unlock
volume         vuid           wdel           logon          listconnect
showconnect    tcon           tdis           tid            utimes
logoff         ..             !

Once your exploration is complete, you can exit the smbclient session:

smb: \> quit

In the following step, we'll explore file transfers between the Linux system and SMB shares.

File Transfers with smbclient: Uploading and Downloading

This final section details the process of transferring files between your Linux system and the SMB share.

Re-establishing the Connection to the Share

Begin by reconnecting to the SMB share:

smbclient //localhost/testshare -U labex

Provide the password when prompted:

Enter WORKGROUP\labex's password:

You should be presented with the smbclient prompt:

Try "help" to get a list of possible commands.
smb: \>

Uploading Files to the SMB Share

Let's upload the previously created test file to the SMB share. First, verify your current local directory:

smb: \> !pwd

This executes the pwd command on your local system, outputting:

/home/labex/project

Next, navigate to the directory containing your test file:

smb: \> lcd ~/project/smb-files

Confirm that you are in the correct directory:

smb: \> !ls

You should see:

test.txt

Initiate the file upload to the SMB share:

smb: \> put test.txt

A message indicating the successful file transfer will appear:

putting file test.txt as \test.txt (38.5 kb/s) (average 38.5 kb/s)

Verify that the file has been uploaded:

smb: \> ls

The output should include:

  .                                   D        0  Tue Nov 30 12:02:00 2022
  ..                                  D        0  Tue Nov 30 12:00:00 2022
  shared-test.txt                     N       37  Tue Nov 30 12:00:00 2022
  test-directory                      D        0  Tue Nov 30 12:01:00 2022
  test.txt                            N       33  Tue Nov 30 12:02:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

Downloading Files from the Share to Linux

Now, let's download a file from the SMB share to your local system. Begin by creating a new directory to house the downloaded files:

smb: \> !mkdir -p ~/project/smb-downloads

Navigate to the newly created directory:

smb: \> lcd ~/project/smb-downloads

Proceed with downloading the file:

smb: \> get shared-test.txt

A message confirming the file transfer will be displayed:

getting file \shared-test.txt of size 37 as shared-test.txt (37.0 KiloBytes/sec) (average 37.0 KiloBytes/sec)

Verify that the file has been successfully downloaded:

smb: \> !ls

The output should show:

shared-test.txt

Leveraging mget and mput for Batch File Transfers

The mget and mput commands streamline the transfer of multiple files in a single operation. Let's create additional files on your local system:

smb: \> !cd ~/project/smb-files && touch file1.txt file2.txt file3.txt

Now, upload all .txt files at once:

smb: \> lcd ~/project/smb-files
smb: \> mput *.txt

For each file, you'll be prompted for confirmation. Type Y to authorize each transfer:

mput test.txt? Y
putting file test.txt as \test.txt (38.5 kb/s) (average 38.5 kb/s)
mput file1.txt? Y
putting file file1.txt as \file1.txt (0.0 kb/s) (average 19.2 kb/s)
mput file2.txt? Y
putting file file2.txt as \file2.txt (0.0 kb/s) (average 12.8 kb/s)
mput file3.txt? Y
putting file file3.txt as \file3.txt (0.0 kb/s) (average 9.6 kb/s)

To bypass confirmation prompts for all files, disable prompting:

smb: \> prompt
smb: \> mput *.txt

Similarly, to download multiple files:

smb: \> lcd ~/project/smb-downloads
smb: \> mget *.txt

When finished, exit the smbclient session:

smb: \> quit

Executing Non-Interactive Commands with smbclient

You can use smbclient to execute commands without entering the interactive shell. For example, list the contents of a share:

smbclient //localhost/testshare -U labex -c 'ls'

Provide the password when prompted, and the directory listing will be displayed:

Enter WORKGROUP\labex's password:
  .                                   D        0  Tue Nov 30 12:03:00 2022
  ..                                  D        0  Tue Nov 30 12:00:00 2022
  file1.txt                           N        0  Tue Nov 30 12:03:00 2022
  file2.txt                           N        0  Tue Nov 30 12:03:00 2022
  file3.txt                           N        0  Tue Nov 30 12:03:00 2022
  shared-test.txt                     N       37  Tue Nov 30 12:00:00 2022
  test-directory                      D        0  Tue Nov 30 12:01:00 2022
  test.txt                            N       33  Tue Nov 30 12:03:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

To download a file using a single command:

smbclient //localhost/testshare -U labex -c 'get test.txt /home/labex/project/test-download.txt'

This command downloads the test.txt file from the share and saves it as test-download.txt in your project directory.

You are now equipped with a strong understanding of utilizing smbclient to connect to SMB shares, navigate directories, and execute file transfers. These skills are invaluable when working in environments that incorporate both Windows and Linux systems.

Conclusion: Mastering smbclient for Linux and Windows Interoperability

In this hands-on lab, we thoroughly explored the smbclient command within Linux, a critical tool for enabling Linux systems to communicate with Windows (SMB/CIFS) file shares. We've addressed several essential aspects of working with smbclient:

  1. Installation Process: We performed a clean installation of the smbclient package on an Ubuntu 22.04 system, including the necessary dependencies.

  2. Command-Line Fundamentals: We clarified the core syntax and frequently used commands available within smbclient, encompassing share connections and navigation techniques.

  3. Test Environment Configuration: We set up a simulated SMB environment leveraging a local Samba server, allowing for comprehensive command practice without the need for an external Windows server.

  4. Share Connection Management: We successfully connected to our test SMB share and practiced fundamental navigation commands, including ls, cd, and mkdir.

  5. File Transfer Operations: We mastered uploading files to an SMB share utilizing the put command and downloading files with get. Additionally, we explored batch file transfers using mput and mget.

The skills honed during this tutorial are directly applicable to real-world scenarios requiring interaction between Linux and Windows systems. Whether you're transferring files, automating backups, or integrating Linux into Windows networks, smbclient offers a powerful command-line interface for these tasks.

For more sophisticated or recurring file management scenarios, consider exploring the option of directly mounting SMB shares into your Linux filesystem using the mount command with the cifs filesystem type, a method that builds upon the foundational concepts presented herein. This allows for seamless integration of Windows file shares into your Linux environment, enhancing productivity and interoperability.

400+ Linux Commands