本文目录导读:

是的,脚本完全可以自动挂载SMB(Samba/CIFS)共享,这在Linux系统中非常常见,通常通过cifs-utils工具包中的mount.cifs命令实现,配合/etc/fstab或systemd挂载单元进行自动化。
下面是几种常见的脚本化自动挂载SMB共享的方法:
前提条件
-
安装依赖: 你的Linux系统需要安装
cifs-utils。# Debian/Ubuntu sudo apt update && sudo apt install cifs-utils # CentOS/RHEL/Fedora sudo yum install cifs-utils # 或者 sudo dnf install cifs-utils
-
创建挂载点: 需要一个本地目录作为共享的挂载点。
sudo mkdir -p /mnt/smb_share
使用脚本配合 /etc/fstab(推荐,开机自动挂载)
这是最常用且最可靠的方法,你可以在/etc/fstab中添加一条记录,然后通过脚本或mount -a命令来触发挂载。
创建凭据文件(安全第一)
为了保护密码,不要在fstab或脚本中明文写密码,而是创建一个只有root可读的凭据文件。
sudo nano /etc/smb-credentials
如下(替换为你的实际信息):
username=你的SMB用户名
password=你的SMB密码
domain=你的域或工作组(可选,如WORKGROUP)
设置安全权限:
sudo chmod 600 /etc/smb-credentials
在 /etc/fstab 中添加一行
sudo nano /etc/fstab
在文件末尾添加(所有内容在一行):
//服务器IP地址/共享名称 /mnt/smb_share cifs credentials=/etc/smb-credentials,iocharset=utf8,file_mode=0755,dir_mode=0755,uid=1000,gid=1000,noperm 0 0
//服务器IP/共享名称:你的SMB服务器地址和共享名。/mnt/smb_share:你创建的本地挂载点。credentials=/etc/smb-credentials:指向凭据文件。iocharset=utf8:解决中文乱码问题。file_mode,dir_mode:设置文件和目录的默认权限。uid,gid:指定拥有挂载点文件的本地用户和组ID(用id 你的用户名命令查看你的uid)。noperm:让客户端忽略服务器端的权限检查,提高兼容性(可选)。0 0:最后两个数字通常为0,表示不进行dump备份和不检查文件系统。
挂载脚本
你可以创建一个简单的脚本来手动或定时执行挂载/卸载。
挂载脚本 (mount_smb.sh):
#!/bin/bash
# 挂载所有在fstab中定义的SMB共享(也可以是所有)
mount -a -t cifs
# 检查挂载是否成功
if mountpoint -q /mnt/smb_share; then
echo "SMB 共享已成功挂载。"
else
echo "挂载失败,请检查凭据和网络。"
fi
卸载脚本 (umount_smb.sh):
#!/bin/bash umount /mnt/smb_share echo "已卸载 /mnt/smb_share"
赋予执行权限并测试
chmod +x mount_smb.sh umount_smb.sh sudo ./mount_smb.sh
使用 systemd 挂载单元(更现代,自动化程度高)
Systemd提供了.mount单元文件,可以更好地与系统启动、依赖管理等集成。
创建挂载点并准备凭据文件(同方法一)
创建 systemd mount 单元
文件名必须与路径匹配,挂载点是/mnt/smb_share,则文件名是mnt-smb_share.mount。
sudo nano /etc/systemd/system/mnt-smb_share.mount
如下:
[Unit] Description=Mount SMB Share Requires=network-online.target After=network-online.target [Mount] What=//服务器IP地址/共享名称 Where=/mnt/smb_share Type=cifs Options=credentials=/etc/smb-credentials,iocharset=utf8,file_mode=0755,dir_mode=0755,uid=1000,gid=1000,noperm [Install] WantedBy=multi-user.target
启用并启动
# 重新加载systemd配置 sudo systemctl daemon-reload # 启动挂载(立即生效) sudo systemctl start mnt-smb_share.mount # 设置开机自启 sudo systemctl enable mnt-smb_share.mount # 检查状态 sudo systemctl status mnt-smb_share.mount
纯脚本(mount.cifs)
适用于一次性挂载或需要动态选择共享地址的场景。
示例脚本 (smb_auto_mount.sh):
#!/bin/bash
# 配置
SMB_SERVER="//192.168.1.100"
SHARE_NAME="SharedDocs"
MOUNT_POINT="/mnt/smb_share"
CREDENTIALS="/etc/smb-credentials"
# 确保挂载点存在
sudo mkdir -p "$MOUNT_POINT"
# 尝试卸载已有的挂载(静默忽略错误)
sudo umount "$MOUNT_POINT" 2>/dev/null
# 执行挂载
echo "尝试挂载 $SMB_SERVER/$SHARE_NAME 到 $MOUNT_POINT..."
sudo mount -t cifs "$SMB_SERVER/$SHARE_NAME" "$MOUNT_POINT" -o "credentials=$CREDENTIALS,iocharset=utf8,file_mode=0755,dir_mode=0755,uid=1000,gid=1000,noperm"
# 检查结果
if [ $? -eq 0 ]; then
echo "挂载成功!"
# 可选:列出共享内容
ls -l "$MOUNT_POINT"
else
echo "挂载失败。"
exit 1
fi
使用 crontab 定时执行:
crontab -e # 添加一行,例如每小时执行一次 0 * * * * /path/to/smb_auto_mount.sh > /dev/null 2>&1
常见问题与解决方案
mount error(13): Permission denied:- 检查用户名/密码是否正确。
- 检查SMB服务器上该用户是否有权限访问该共享。
- 尝试添加
sec=ntlm或sec=ntlmv2到挂载选项中。
mount error(2): No such file or directory:- 检查服务器地址和共享名称是否拼写正确。
- 确认本地挂载点目录已经创建。
- 挂载后显示或乱码:
- 确保添加了
iocharset=utf8选项。
- 确保添加了
- 自动挂载经常断连或无法访问:
- 在
fstab或挂载选项中添加_netdev选项(针对网络文件系统)。 - 添加
vers=3.0或vers=2.0来指定SMB协议版本(如果你的服务器是旧版Windows或新版Linux有兼容性问题)。credentials=...,vers=3.0。
- 在
- 对于永久、开机自动挂载: 强烈推荐
/etc/fstab+ 凭据文件(方法一),简单、稳定、标准。 - 对于更现代的Systemd系统: 使用systemd mount单元(方法二)提供更好的启动控制和依赖管理。
- 对于需要脚本控制和灵活性的场景: 使用纯脚本(方法三),可以配合定时任务(cron)或作为其他自动化流程的一部分。
所有方法都建议使用独立的凭据文件并且设置为600权限(仅root可读写),以确保密码安全。