脚本能自动挂载SMB共享吗?

wen 实用脚本 4

本文目录导读:

脚本能自动挂载SMB共享吗?

  1. 前提条件
  2. 方法一:使用脚本配合 /etc/fstab(推荐,开机自动挂载)
  3. 方法二:使用 systemd 挂载单元(更现代,自动化程度高)
  4. 方法三:纯脚本(mount.cifs
  5. 常见问题与解决方案

是的,脚本完全可以自动挂载SMB(Samba/CIFS)共享,这在Linux系统中非常常见,通常通过cifs-utils工具包中的mount.cifs命令实现,配合/etc/fstab或systemd挂载单元进行自动化。

下面是几种常见的脚本化自动挂载SMB共享的方法:

前提条件

  1. 安装依赖: 你的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
  2. 创建挂载点: 需要一个本地目录作为共享的挂载点。

    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=ntlmsec=ntlmv2到挂载选项中。
  • mount error(2): No such file or directory
    • 检查服务器地址和共享名称是否拼写正确。
    • 确认本地挂载点目录已经创建。
  • 挂载后显示或乱码
    • 确保添加了iocharset=utf8选项。
  • 自动挂载经常断连或无法访问
    • fstab或挂载选项中添加_netdev选项(针对网络文件系统)。
    • 添加vers=3.0vers=2.0来指定SMB协议版本(如果你的服务器是旧版Windows或新版Linux有兼容性问题)。credentials=...,vers=3.0
  • 对于永久、开机自动挂载: 强烈推荐/etc/fstab + 凭据文件(方法一),简单、稳定、标准。
  • 对于更现代的Systemd系统: 使用systemd mount单元(方法二)提供更好的启动控制和依赖管理。
  • 对于需要脚本控制和灵活性的场景: 使用纯脚本(方法三),可以配合定时任务(cron)或作为其他自动化流程的一部分。

所有方法都建议使用独立的凭据文件并且设置为600权限(仅root可读写),以确保密码安全。

抱歉,评论功能暂时关闭!