Linux命令-smbclient(Samba/CIFS 客户端)
- 🔰 简介
- 📖 语法
- ⚙️ 选项
- 💡 交互命令
- 文件和目录操作
- 本地和会话控制
- 💡 示例
- 示例 1:列出服务器共享并连接
- 示例 2:非交互式操作——单条命令和脚本自动化
- 示例 3:备份 Windows 共享到 tar 归档
- 示例 4:自动化备份脚本
- 示例 5:指定 SMB 协议版本调试连接问题
- ⚠️ 注意
- 📚 相关命令
- 📝 总结
快速参考:smbclient是 Samba 套件中的命令行 FTP 式客户端,用于访问 Windows 共享文件夹(SMB/CIFS 协议)。它提供交互式 Shell 和非交互式命令两种模式,是 Linux 与 Windows 互操作的核心工具之一。
smbclient不需要挂载文件系统即可访问共享,适合临时查看、脚本自动化、备份等场景。如果需要持久挂载共享为本地目录,请使用mount -t cifs。
🔰 简介
SMB(Server Message Block)协议是 Windows 文件和打印共享的基础,CIFS(Common Internet File System)是其后续版本。smbclient由 Samba 项目开发,让 Linux/Unix 系统能够像 FTP 客户端一样访问 SMB/CIFS 共享资源。
安装方式(因发行版而异):
# Debian/Ubuntu$sudoapt-getinstallsmbclient# RHEL/CentOS 7$sudoyuminstallsamba-client# RHEL/CentOS 8+ / Fedora$sudodnfinstallsamba-client# Arch Linux$sudopacman-Ssmbclient# openSUSE$sudozypperinstallsamba-client# 验证安装$ smbclient--versionVersion4.19.5-Debian📖 语法
smbclient //服务器/共享名[选项]smbclient-L服务器[选项]# 列出共享smbclient //服务器/共享名-c"命令"# 执行单条命令⚙️ 选项
| 选项 | 说明 |
|---|---|
-L 服务器 | 列出远程服务器上的所有共享资源 |
-U 用户名[%密码] | 指定登录用户名和密码(密码可直接跟在%后) |
-W 工作组/域 | 指定工作组或域名 |
-N | 匿名登录(无密码),等同于-U ""%"" |
-p 端口 | 指定 SMB 端口(默认 445,旧版 139) |
-m 协议级别 | 指定 SMB 协议版本(如SMB2、SMB3) |
-c "命令" | 连接后立即执行指定命令,执行完后退出 |
-d 级别 | 调试级别(0-10),越高信息越详细 |
-I IP地址 | 使用 IP 地址连接(跳过 NetBIOS 名称解析) |
-A 认证文件 | 从文件读取用户名和密码(格式:username=xxxpassword=xxx) |
--max-protocol 版本 | 限制最高协议版本 |
--min-protocol 版本 | 限制最低协议版本 |
-t 终端代码 | 指定终端字符编码(如-t utf8) |
-T 选项 | 创建 tar 格式备份(c创建、x提取) |
💡 交互命令
进入 smbclient 交互模式后,可以使用的命令:
文件和目录操作
| 命令 | 说明 |
|---|---|
ls/dir | 列出远程共享中的文件和目录 |
cd 目录 | 切换远程工作目录 |
pwd | 显示远程当前目录 |
get 文件 [本地名] | 下载远程文件 |
put 文件 [远程名] | 上传本地文件 |
mget 通配符 | 批量下载文件 |
mput 通配符 | 批量上传文件 |
mkdir 目录 | 创建远程目录 |
rmdir 目录 | 删除远程空目录 |
del 文件/rm 文件 | 删除远程文件 |
rename 旧名 新名 | 重命名远程文件 |
more 文件 | 查看远程文件内容 |
recurse | 切换递归操作开关(配合 mget/mput 使用) |
prompt | 切换批量操作时的确认提示 |
lowercase | 切换下载文件名自动转小写 |
本地和会话控制
| 命令 | 说明 |
|---|---|
lcd 目录 | 切换本地工作目录 |
!命令 | 在本地 Shell 中执行命令 |
queue | 显示打印队列(如果共享是打印机) |
print 文件 | 打印文件到远程打印机 |
volume | 显示共享的卷标信息 |
stat 文件 | 显示远程文件详细信息 |
altname 文件 | 显示文件的 8.3 短文件名 |
exit/quit/q | 退出 smbclient |
💡 示例
示例 1:列出服务器共享并连接
# Step 1: 扫描目标服务器上的所有共享$ smbclient-L192.168.1.50-NSharename Type Comment --------- ---- ------- ADMIN$ Disk 远程管理 C$ Disk 默认共享 IPC$ IPC 远程 IPC ShareDocs Disk 共享文档 UserData Disk 用户数据 Printer1 Printer HP LaserJet SMB1 disabled -- no workgroup available# Step 2: 交互式连接到共享$ smbclient //192.168.1.50/ShareDocs-Ujohn Passwordfor[WORKGROUP\john]: ******** Try"help"to get a list of possible commands. smb:\>ls.D0Sat Jun1410:00:002026..D0Sat Jun1410:00:002026project_docs D0Fri Jun1315:30:002026README.txt A2048Sat Jun1409:00:002026sales_report.xlsx A15360Fri Jun1311:20:00202610485760blocks of size1024.5242880blocks available smb:\>cdproject_docs smb:\project_docs\>get design_spec.pdf gettingfile\project_docs\design_spec.pdf of size524288as design_spec.pdf(512.0KiloBytes/sec)(average512.0KiloBytes/sec)smb:\project_docs\>exit# 预期输出:# 列出所有共享 → 密码认证 → 浏览目录 → 下载文件 → 退出示例 2:非交互式操作——单条命令和脚本自动化
# 方式一:使用 -c 执行单条命令$ smbclient //192.168.1.50/ShareDocs-Ujohn%mypassword-c"ls"# 注:%后面跟密码虽然方便,但在命令行中暴露密码不安全# 方式二:使用认证文件(更安全)$cat>~/.smb_credentials<<'CRED' username=john password=MySecurePass123 domain=WORKGROUP CRED$chmod600~/.smb_credentials $ smbclient //192.168.1.50/ShareDocs-A~/.smb_credentials-c"ls"# 方式三:多命令串联(用分号分隔)$ smbclient //192.168.1.50/ShareDocs-A~/.smb_credentials\-c"cd backups; prompt off; mget *.tar.gz; exit"# 预期输出:# getting file \backups\db_backup_20260601.tar.gz of size 104857600 ...# getting file \backups\db_backup_20260608.tar.gz of size 106954752 ...# 方式四:Here Document 实现复杂操作$ smbclient //fileserver/IT-A~/.smb_credentials<<'SMBCMD' cd Software/Linux mkdir "New Deployment" cd "New Deployment" lcd /tmp/deploy prompt off mput * ls exit SMBCMD# 预期输出:# smb: \> cd Software\Linux# smb: \Software\Linux\> mkdir "New Deployment"# smb: \Software\Linux\> cd "New Deployment"# smb: \Software\Linux\New Deployment\> lcd /tmp/deploy# smb: \Software\Linux\New Deployment\> mput deploy.tar.gz install.sh config.ini# Putting file deploy.tar.gz as \Software\Linux\New Deployment\deploy.tar.gz (100%)# Putting file install.sh as \Software\Linux\New Deployment\install.sh (100%)# Putting file config.ini as \Software\Linux\New Deployment\config.ini (100%)# smb: \Software\Linux\New Deployment\> ls# deploy.tar.gz A 10240000 Sat Jun 14 10:00:00 2026# install.sh A 512 Sat Jun 14 10:00:00 2026# config.ini A 2048 Sat Jun 14 10:00:00 2026示例 3:备份 Windows 共享到 tar 归档
# smbclient 内置 tar 模式,可直接将共享内容打包成 tar# 这是备份 Windows 共享最便捷的方式之一# 创建备份(tar 归档到本地文件)$ smbclient //192.168.1.50/ShareDocs-A~/.smb_credentials\-Tc/backup/share_backup_$(date+%Y%m%d).tar# 从 tar 归档恢复到共享$ smbclient //192.168.1.50/ShareDocs-A~/.smb_credentials\-Tx/backup/share_backup_20260601.tar# 备份特定子目录$ smbclient //192.168.1.50/UserData-A~/.smb_credentials\-Tc/backup/userdata.tar project_docs/\*.pdf reports/\*# 指定 tar 增量备份(仅备份新文件)$ smbclient //192.168.1.50/ShareDocs-A~/.smb_credentials\-TcN/backup/share_incremental.tar# 预期输出:# 打包过程会在标准输出显示正在处理的文件列表# tar: dumped 142 files, 524288000 bytes total示例 4:自动化备份脚本
#!/bin/bash# Windows 共享自动备份脚本# 将 Windows 共享内容周期备份到 Linux 服务器set-eCRED_FILE="/root/.smb_credentials"BACKUP_DIR="/backup/windows_shares"LOG_FILE="/var/log/smb_backup.log"DATE=$(date+%Y%m%d_%H%M%S)# 共享列表(格式:服务器 共享名)declare-ASHARES=(["fs01"]="IT_Docs HR_Data Finance"["fs02"]="Projects Backup")log(){echo"[$(date'+%Y-%m-%d %H:%M:%S')]$*"|tee-a"$LOG_FILE"}mkdir-p"$BACKUP_DIR"forSERVERin"${!SHARES[@]}";doforSHAREin${SHARES[$SERVER]};doBACKUP_FILE="${BACKUP_DIR}/${SERVER}_${SHARE}_${DATE}.tar"log"开始备份: //${SERVER}/${SHARE}->${BACKUP_FILE}"smbclient"//${SERVER}/${SHARE}"\-A"$CRED_FILE"\-Tc"$BACKUP_FILE"2>>"$LOG_FILE"if[$?-eq0];thenSIZE=$(du-sh"$BACKUP_FILE"|cut-f1)log"备份成功:${BACKUP_FILE}(${SIZE})"elselog"备份失败: //${SERVER}/${SHARE}"fidonedone# 清理 30 天前的旧备份find"$BACKUP_DIR"-name"*.tar"-mtime+30-deletelog"清理完成,已删除 30 天前的备份"# 预期日志输出:# [2026-06-14 03:00:01] 开始备份: //fs01/IT_Docs -> /backup/windows_shares/fs01_IT_Docs_20260614_030001.tar# [2026-06-14 03:05:23] 备份成功: /backup/windows_shares/fs01_IT_Docs_20260614_030001.tar (245M)# [2026-06-14 03:05:23] 开始备份: //fs01/HR_Data -> /backup/windows_shares/fs01_HR_Data_20260614_030523.tar# [2026-06-14 03:06:45] 备份成功: /backup/windows_shares/fs01_HR_Data_20260614_030523.tar (12M)示例 5:指定 SMB 协议版本调试连接问题
# Windows 10/11 和 Windows Server 默认禁用 SMB1(因 WannaCry 安全漏洞)# 如果连接失败,需要指定更高的协议版本# 尝试使用 SMB2 连接$ smbclient //windows-server/Share-Uuser-mSMB2# 或$ smbclient //windows-server/Share-Uuser --max-protocol SMB3# 调试连接问题(-d 3 输出详细调试信息)$ smbclient //192.168.1.50/ShareDocs-Ujohn-d3-c"ls"lp_load_ex: refreshing parameters Initialising global parameters Processing section"[global]"added interface eth0ip=192.168.1.10bcast=192.168.1.255netmask=255.255.255.0 Connecting to192.168.1.50 at port445Got a positive name query response from192.168.1.50(192.168.1.50)saved_session_key:len=16doing spnego session setup gotOID=1.3.6.1.4.1.311.2.2.30 gotprincipal=NONE gotprincipal=not_defined_in_RFC4178@please_ignore.D0Sat Jun1410:00:002026..D0Sat Jun1410:00:002026# 指定 NetBIOS 名称和 IP(解决名称解析问题)$ smbclient //192.168.1.50/ShareDocs-I192.168.1.50-WWORKGROUP-Ujohn⚠️ 注意
smbclient vs mount -t cifs 的选择:
| 特性 | smbclient | mount -t cifs |
|---|---|---|
| 访问方式 | FTP 式交互命令 | 文件系统挂载,像本地目录 |
| 持久性 | 临时访问 | 可持久挂载(fstab) |
| 资源占用 | 按需连接,不占用挂载点 | 持续占用内核资源 |
| 应用兼容 | 仅 smbclient 支持的操作用 | 所有应用都能直接访问 |
| 脚本友好 | ✅-c非交互模式 | 需处理挂载/卸载 |
| 适用场景 | 临时传输、备份脚本 | 长期文件共享、开发环境 |
常见问题排查:
- “NT_STATUS_CONNECTION_REFUSED”— 目标服务器 445 端口未开放,或防火墙阻止
- “NT_STATUS_LOGON_FAILURE”— 用户名或密码错误,注意域名前缀
- “protocol negotiation failed: NT_STATUS_CONNECTION_RESET”— SMB 协议版本不匹配,尝试指定
-m SMB2或-m SMB3- 中文文件名乱码— 添加
-t utf8选项,或设置LANG=zh_CN.UTF-8
📚 相关命令
| 命令 | 说明 |
|---|---|
smbpasswd | 管理 Samba 用户密码 |
smbstatus | 查看 Samba 服务器连接状态 |
mount -t cifs | 将 SMB/CIFS 共享挂载到本地目录 |
nmblookup | NetBIOS 名称查询 |
smbtree | 以树形结构显示网络中的共享 |
smbcontrol | 向 Samba 守护进程发送控制消息 |
testparm | 检查 Samba 配置文件语法 |
📝 总结
smbclient是 Linux 管理员访问 Windows 共享的瑞士军刀,它的价值在于:
- 零挂载代价:不需要 root 权限挂载目录,普通用户即可使用
- FTP 式操作:交互命令直观,学习曲线低
- 脚本化友好:
-c选项和 Here Document 支持完美的自动化 - 内置备份:tar 模式可直接打包远程共享,无需额外工具
- 协议灵活:支持 SMB1 到 SMB3 的完整协议栈
日常运维中,临时访问 Windows 共享用 smbclient,长期挂载用mount -t cifs。两者搭配使用,覆盖所有 Linux-Windows 互操作场景。