使用Samba(SMB/CIFS)

  • 安装cifs-utils

在大多数Linux发行版中,你需要安装cifs-utils包来支持SMB/CIFS协议。

对于基于Debian的系统(如Ubuntu),使用:

sudo apt-get update
sudo apt-get install cifs-utils
  • 创建挂载点

选择一个本地目录作为挂载点,如果不存在,则创建它:

sudo mkdir /mnt/smbshare

/mnt/smbshare修改为自定义挂载点。

  • 使用凭证文件

创建一个凭证文件:

echo "username=yourusername" > /etc/samba/credentials
echo "password=yourpassword" >> /etc/samba/credentials
chmod 600 /etc/samba/credentials

yourusername修改为需要连接SMB文件的用户名yourpassword修改为需要连接SMB文件的密码

创建挂载脚本

  • 首先创建脚本文件

sudo nano /usr/local/bin/smb-mount

/usr/local/bin/文件位置不要修改!

  • 将以下代码复制到文件中

#!/bin/bash

# SMB 共享挂载管理脚本
# 用法: smb-mount {mount|umount|status|remount}

# 配置变量 - 可以根据需要修改
CREDENTIALS_FILE="/etc/samba/credentials"
MOUNT_OPTIONS="credentials=$CREDENTIALS_FILE,uid=1000,gid=1000,file_mode=0777,dir_mode=0777,sec=ntlmssp,noserverino"

# 定义共享列表:("服务器地址/共享名" "挂载点")
declare -A SHARES=(
    ["//192.168.1.100/sharename"]="/mnt/smbshare"
    #如果需要挂载多个SMB文件,可以继续设置以下内容。
    #["//192.168.1.100/sharename"]="/mnt/smbshare"
)

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印彩色输出
print_status() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

# 检查是否以root权限运行
check_root() {
    if [ "$EUID" -ne 0 ]; then
        print_error "请使用sudo运行此脚本: sudo $0 $1"
        exit 1
    fi
}

# 检查凭证文件
check_credentials() {
    if [ ! -f "$CREDENTIALS_FILE" ]; then
        print_error "凭证文件不存在: $CREDENTIALS_FILE"
        print_status "请创建凭证文件,内容格式如下:"
        echo "username=你的用户名"
        echo "password=你的密码"
        echo "domain=WORKGROUP (可选)"
        exit 1
    fi
    
    if [ $(stat -c %a "$CREDENTIALS_FILE") != "600" ]; then
        print_warning "凭证文件权限不安全,正在修复..."
        chmod 600 "$CREDENTIALS_FILE"
    fi
}

# 创建挂载点目录
create_mountpoints() {
    for mountpoint in "${SHARES[@]}"; do
        if [ ! -d "$mountpoint" ]; then
            print_status "创建挂载点目录: $mountpoint"
            mkdir -p "$mountpoint"
            chown 1000:1000 "$mountpoint"
        fi
    done
}

# 挂载所有共享
mount_all() {
    check_root "mount"
    check_credentials
    create_mountpoints
    
    print_status "开始挂载SMB共享..."
    
    for share in "${!SHARES[@]}"; do
        mountpoint="${SHARES[$share]}"
        
        # 检查是否已挂载
        if mountpoint -q "$mountpoint"; then
            print_warning "$share 已经挂载到 $mountpoint"
            continue
        fi
        
        # 尝试挂载
        print_status "挂载 $share 到 $mountpoint"
        if mount -t cifs -o "$MOUNT_OPTIONS" "$share" "$mountpoint" 2>/dev/null; then
            print_success "$share 挂载成功"
        else
            print_error "$share 挂载失败"
        fi
    done
}

# 卸载所有共享
umount_all() {
    check_root "umount"
    
    print_status "开始卸载SMB共享..."
    
    for mountpoint in "${SHARES[@]}"; do
        # 检查是否已挂载
        if mountpoint -q "$mountpoint"; then
            print_status "卸载 $mountpoint"
            if umount "$mountpoint" 2>/dev/null; then
                print_success "$mountpoint 卸载成功"
            else
                print_warning "$mountpoint 卸载失败,尝试强制卸载..."
                umount -f "$mountpoint" 2>/dev/null || umount -l "$mountpoint"
            fi
        else
            print_warning "$mountpoint 未挂载"
        fi
    done
}

# 查看挂载状态
check_status() {
    print_status "当前SMB共享挂载状态:"
    echo "----------------------------------------"
    
    for share in "${!SHARES[@]}"; do
        mountpoint="${SHARES[$share]}"
        if mountpoint -q "$mountpoint"; then
            echo -e "${GREEN}✓${NC} $share -> $mountpoint ${GREEN}(已挂载)${NC}"
        else
            echo -e "${RED}✗${NC} $share -> $mountpoint ${RED}(未挂载)${NC}"
        fi
    done
    
    echo "----------------------------------------"
    
    # 显示所有CIFS挂载
    if mount | grep -q cifs; then
        print_status "系统当前所有CIFS挂载:"
        mount | grep cifs
    fi
}

# 重新挂载
remount_all() {
    umount_all
    sleep 2
    mount_all
}

# 显示用法
show_usage() {
    echo "SMB共享挂载管理脚本"
    echo "用法: $0 {mount|umount|status|remount|help}"
    echo ""
    echo "命令:"
    echo "  mount    挂载所有SMB共享"
    echo "  umount   卸载所有SMB共享"
    echo "  status   查看挂载状态"
    echo "  remount  重新挂载所有共享"
    echo "  help     显示帮助信息"
    echo ""
    echo "配置的共享:"
    for share in "${!SHARES[@]}"; do
        echo "  $share -> ${SHARES[$share]}"
    done
}

# 主程序
case "$1" in
    "mount")
        mount_all
        ;;
    "umount")
        umount_all
        ;;
    "status")
        check_status
        ;;
    "remount")
        remount_all
        ;;
    "help"|"-h"|"--help")
        show_usage
        ;;
    *)
        if [ -z "$1" ]; then
            show_usage
        else
            print_error "未知命令: $1"
            show_usage
            exit 1
        fi
        ;;
esac
  • 保存文件后,设置执行权限

sudo chmod +x /usr/local/bin/smb-mount

使用方法

现在你可以使用这个脚本方便地管理SMB挂载:

🔹 挂载所有共享

sudo smb-mount mount

🔹 卸载所有共享

sudo smb-mount umount

🔹 查看挂载状态

sudo smb-mount status
# 或者普通用户也可以查看状态
smb-mount status

🔹 重新挂载

sudo smb-mount remount

🔹 显示帮助信息

smb-mount help

如果需要开机自动挂载

🔹方法1

  • 虽然脚本用于手动管理,但你也可以创建systemd服务来实现开机自动挂载:

#创建系统服务
sudo nano /etc/systemd/system/smb-mount.service

  • 添加以下内容:

[Unit]Description=Mount SMB 
SharesAfter=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/smb-mount 
mountExecStop=/usr/local/bin/smb-mount 
umountRemainAfterExit=yes

[Install]WantedBy=multi-user.target
  • 然后启用服务:

sudo systemctl enable smb-mount.service
sudo systemctl start smb-mount.service

这样你的SMB共享就会在系统启动时自动挂载了!

🔹方法2

  • 创建.desktop文件
sudo nano /etc/xdg/autostart/autoSMB.desktop
  • 添加以下内容:
[Desktop Entry]
Version=1.0
Type=Application
Name=autoSMB
Exec=sudo smb-mount mount
Path=/
Terminal=false
StartupNotify=false

这样你的SMB共享就会在系统启动时自动挂载了!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐