介绍
在这个实验中,我们将探索 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 系统之间传输文件
在 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 共享时,你可以使用各种命令来导航和操作文件。以下是一些常用命令:
ls或dir:列出文件和目录cd directory:更改到不同的目录get file [localfile]:从共享下载文件put file [remotefile]:将文件上传到共享mget files...:下载多个文件mput files...:上传多个文件mkdir directory:创建目录rmdir directory:删除目录rm file:删除文件help或?:显示帮助quit或exit:退出 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 传输多个文件
mget 和 mput 命令允许你一次传输多个文件。让我们尝试在我们的本地系统上创建更多文件:
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 的几个关键方面:
**安装 (Installation)**:我们在 Ubuntu 22.04 上安装了
smbclient包,其中包括它的依赖项。**命令基础 (Command Basics)**:我们学习了
smbclient中可用的基本语法和命令,包括如何连接到共享并在其中导航。**设置测试环境 (Setting Up a Test Environment)**:我们使用本地 Samba 服务器创建了一个测试 SMB 环境,以便在不需要访问外部 Windows 服务器的情况下练习我们的命令。
**连接到共享 (Connecting to Shares)**:我们连接到我们的测试 SMB 共享,并探索了导航命令,例如
ls、cd和mkdir。**传输文件 (Transferring Files)**:我们学习了如何使用
put将文件上传到 SMB 共享,以及使用get下载文件。我们还使用mput和mget探索了多个文件传输。
你从这个实验中获得的技能可以直接应用于你需要从 Linux 环境与 Windows 系统或服务器交互的实际场景。无论你是在系统之间传输文件、自动化备份,还是将 Linux 系统集成到 Windows 网络中,smbclient 都为这些任务提供了强大的命令行界面。
对于更复杂或更频繁的文件操作,你可能需要探索使用 mount 命令和 cifs 文件系统类型将 SMB 共享直接挂载到你的 Linux 文件系统中,这建立在我们在这里学到的概念之上。



