Linux smbclient 命令:实战示例详解

LinuxBeginner
立即练习

介绍

在这个实验中,我们将探索 Linux 的 smbclient 命令及其实际应用。smbclient 实用程序是一个强大的工具,它允许 Linux 系统与 Windows 文件共享(SMB/CIFS 共享)交互。SMB(服务器消息块,Server Message Block)是 Windows 用于文件共享的网络协议,而 smbclient 允许 Linux 用户访问这些共享。

我们将首先在 Ubuntu 22.04 系统上安装 smbclient,学习该命令的基本语法,然后演示如何连接到 Windows 共享、导航目录和传输文件。

通过完成这个实验,你将能够:

  • 安装和配置 smbclient 实用程序
  • 从 Linux 连接到 Windows 共享
  • 导航和列出 Windows 共享上的文件
  • 在 Linux 和 Windows 系统之间传输文件

Linux 命令速查表

在 Ubuntu 22.04 上安装 smbclient

smbclient 包是一个命令行工具,它使 Linux 系统能够与 Windows 环境中常用的 SMB/CIFS 文件共享交互。在这一步,我们将在 Ubuntu 系统上安装这个包。

首先,让我们更新包索引,以确保我们获得最新版本:

sudo apt update

你应该看到类似这样的输出:

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

现在,让我们安装 smbclient 包:

sudo apt install -y smbclient

输出将类似于这样:

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) ...

要验证 smbclient 是否已正确安装,请运行:

smbclient --version

你应该看到显示已安装的 smbclient 版本的输出:

Version 4.15.5-Ubuntu

现在我们已经安装了 smbclient,我们可以开始使用它与 SMB/CIFS 共享交互了。

理解 smbclient 基础知识

现在我们已经安装了 smbclient,在连接到实际的 SMB 共享之前,让我们了解它的基本用法和语法。

命令语法

smbclient 命令的基本语法是:

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

其中:

  • //server/share 是 SMB 共享的 UNC(通用命名约定,Universal Naming Convention)路径
  • -U username%password 指定用于身份验证的用户名和密码
  • [options] 是你可以提供的附加参数

创建用于练习的本地目录

让我们创建一个目录,我们可以在其中存储可能想要传输到 SMB 共享或从 SMB 共享传输的文件:

mkdir -p ~/project/smb-files

让我们在这个目录中创建一个示例文件,我们稍后可以使用它:

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

探索 smbclient 帮助

要查看 smbclient 的所有可用选项,请使用 help 命令:

smbclient --help

这将显示一个冗长的帮助文本,其中包含所有可用选项。以下是你可能看到的内容的片段:

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
...

常用 smbclient 命令

当你使用 smbclient 连接到 SMB 共享时,你可以使用各种命令来导航和操作文件。以下是一些常用命令:

  • lsdir:列出文件和目录
  • cd directory:更改到不同的目录
  • get file [localfile]:从共享下载文件
  • put file [remotefile]:将文件上传到共享
  • mget files...:下载多个文件
  • mput files...:上传多个文件
  • mkdir directory:创建目录
  • rmdir directory:删除目录
  • rm file:删除文件
  • help?:显示帮助
  • quitexit:退出 smbclient

现在我们了解了 smbclient 的基础知识,在下一步中,我们将看到如何连接到实际的 SMB 共享。

设置测试 SMB 环境

在现实世界中,你将连接到实际的 Windows 或 Samba 服务器。但是,对于这个实验,我们将使用本地 Samba 服务器模拟一个 SMB 环境。这种方法允许我们练习 smbclient 命令,而无需访问外部服务器。

安装 Samba 服务器

首先,让我们安装 Samba 服务器软件包:

sudo apt install -y samba

你应该看到指示安装过程的输出:

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.
...

创建 Samba 共享

现在,让我们创建一个简单的 Samba 共享配置。首先,让我们备份原始配置文件:

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

创建要共享的目录:

mkdir -p ~/project/samba-share

让我们在这个共享目录中创建一个测试文件:

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

现在,让我们创建一个简化的 Samba 配置:

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'

将当前用户添加到 Samba 用户并设置用于测试的密码:

sudo smbpasswd -a labex

当提示时,输入一个简单的密码,例如 password(你需要输入两次):

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

重新启动 Samba 服务以应用更改:

sudo service smbd restart

现在,我们在系统上设置了一个名为 testshare 的本地 Samba 共享。我们可以使用 smbclient 连接到它,就像它是一个远程 Windows 共享一样。

使用 smbclient 连接到 SMB 共享

现在我们已经设置好了测试 SMB 环境,让我们使用 smbclient 连接到共享。

列出可用共享

首先,让我们列出本地机器上所有可用的共享:

smbclient -L localhost -U labex

当提示时,输入你为 Samba 用户设置的密码(例如,password):

Enter WORKGROUP\labex's password:

你应该看到类似这样的输出:

        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

这显示了我们新创建的 testshare 共享是可用的。

连接到共享

现在,让我们连接到 testshare 共享:

smbclient //localhost/testshare -U labex

当提示时,输入密码:

Enter WORKGROUP\labex's password:

成功连接后,你将看到 smbclient 提示符:

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

导航和列出文件

现在我们已经连接到共享,让我们探索一些基本命令:

列出当前目录中的文件:

smb: \> ls

你应该看到我们之前创建的测试文件:

  .                                   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

创建远程目录

让我们在 SMB 共享上创建一个新目录:

smb: \> mkdir test-directory

再次列出内容以验证目录是否已创建:

smb: \> ls

你应该看到新目录:

  .                                   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

更改目录

让我们更改到我们刚刚创建的目录:

smb: \> cd test-directory

验证我们是否在新目录中:

smb: \test-directory\> ls

输出应该显示一个空目录:

  .                                   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

要返回到父目录:

smb: \test-directory\> cd ..

在 smbclient 中获取帮助

要查看 smbclient 中可用的命令:

smb: \> help

你将看到所有可用命令的列表:

?              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         ..             !

当你完成探索后,你可以退出 smbclient 会话:

smb: \> quit

在下一步中,我们将学习如何在 Linux 系统和 SMB 共享之间传输文件。

使用 smbclient 传输文件

在最后一步中,我们将学习如何在我们的 Linux 系统和 SMB 共享之间传输文件。

重新连接到共享

让我们再次连接到我们的 SMB 共享:

smbclient //localhost/testshare -U labex

当提示时,输入密码:

Enter WORKGROUP\labex's password:

你应该看到 smbclient 提示符:

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

上传文件到共享

让我们将我们之前创建的测试文件上传到 SMB 共享。首先,我们需要检查我们当前的本地目录:

smb: \> !pwd

这会在你的本地系统上运行 pwd 命令,应该显示:

/home/labex/project

我们需要更改到我们的测试文件所在的目录:

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

验证我们是否在正确的目录中:

smb: \> !ls

你应该看到:

test.txt

现在,让我们将文件上传到 SMB 共享:

smb: \> put test.txt

你应该看到一条消息,指示文件已传输:

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

验证文件是否已上传:

smb: \> ls

你应该看到:

  .                                   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

从共享下载文件

现在,让我们将文件从 SMB 共享下载到我们的本地系统。首先,让我们创建一个新目录来存储下载的文件:

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

更改到该目录:

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

现在,下载文件:

smb: \> get shared-test.txt

你应该看到一条消息,指示文件已传输:

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

验证文件是否已下载:

smb: \> !ls

你应该看到:

shared-test.txt

使用 mget 和 mput 传输多个文件

mgetmput 命令允许你一次传输多个文件。让我们尝试在我们的本地系统上创建更多文件:

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

现在,让我们一次上传所有 .txt 文件:

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

对于每个文件,你将被要求确认。键入 Y 以确认每次传输:

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)

如果你想在没有确认的情况下传输所有文件,你可以关闭提示:

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

同样,要下载多个文件:

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

完成后,退出 smbclient 会话:

smb: \> quit

非交互式命令

你也可以使用 smbclient 在不进入交互式 shell 的情况下执行命令。例如,要列出共享的内容:

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

当提示时,输入密码,你将看到目录列表:

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

要在一个命令中下载文件:

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

此命令从共享下载 test.txt 文件,并将其保存为项目目录中的 test-download.txt

你现在很好地理解了如何使用 smbclient 连接到 SMB 共享、导航目录和传输文件。这些技能在混合 Windows/Linux 环境中工作时至关重要。

总结

在这个实验中,我们探索了 Linux 中的 smbclient 命令,它为连接 Linux 系统到 Windows (SMB/CIFS) 文件共享提供了一个重要的工具。我们涵盖了使用 smbclient 的几个关键方面:

  1. **安装 (Installation)**:我们在 Ubuntu 22.04 上安装了 smbclient 包,其中包括它的依赖项。

  2. **命令基础 (Command Basics)**:我们学习了 smbclient 中可用的基本语法和命令,包括如何连接到共享并在其中导航。

  3. **设置测试环境 (Setting Up a Test Environment)**:我们使用本地 Samba 服务器创建了一个测试 SMB 环境,以便在不需要访问外部 Windows 服务器的情况下练习我们的命令。

  4. **连接到共享 (Connecting to Shares)**:我们连接到我们的测试 SMB 共享,并探索了导航命令,例如 lscdmkdir

  5. **传输文件 (Transferring Files)**:我们学习了如何使用 put 将文件上传到 SMB 共享,以及使用 get 下载文件。我们还使用 mputmget 探索了多个文件传输。

你从这个实验中获得的技能可以直接应用于你需要从 Linux 环境与 Windows 系统或服务器交互的实际场景。无论你是在系统之间传输文件、自动化备份,还是将 Linux 系统集成到 Windows 网络中,smbclient 都为这些任务提供了强大的命令行界面。

对于更复杂或更频繁的文件操作,你可能需要探索使用 mount 命令和 cifs 文件系统类型将 SMB 共享直接挂载到你的 Linux 文件系统中,这建立在我们在这里学到的概念之上。

Linux 命令速查表