Golang中如何在Linux下挂载共享文件夹

Golang中如何在Linux下挂载共享文件夹 你好,如何在 Linux 下使用 syscall.Mount() 挂载共享文件夹?

致意
Phuoc

// 示例代码
func main() {
    // 这里可以添加 syscall.Mount 的使用示例
}
4 回复

您是否尝试挂载Samba(或微软)CIFS共享?

更多关于Golang中如何在Linux下挂载共享文件夹的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,这是一个带有凭据的CIFS共享。
通过终端使用ssh命令可以正常工作:

sudo mount -t cifs //servername/TEST /mnt/TEST -o username=test,password=xxx,vers=3.0

但我想使用:

syscall.Mount(…)

我尝试参考这个链接(C++代码)中的方法,但没有成功。

user2914066

在Linux中使用C++挂载网络驱动器

c++, c, linux, mount

有什么建议吗?

首先,我从未真正用Go语言实现过这个功能,请考虑到这一点。

通常,简单的解决方法是设置环境,使得在mount命令中无需提供凭据。(除了不方便之外,这种方式也不安全。)将用户名和密码存入文件,并确保文件设置了适当的权限。

文件内容大致如下:

username=用户名
password=密码

其中用户名是有权访问共享的用户名,密码是该用户的SMB密码。

然后在客户端的/etc/fstab中添加一项来挂载CIFS共享。内容大致如下:

//172.16.21.1/share1 /share1 cifs credentials=/home/jay/.smb_auth,uid=1000,gid=1000,iocharset=utf8 0 0

这类似于我在Linux系统上挂载局域网CIFS共享的方式。文件服务器的IP地址是172.16.21.1,名为“share1”的CIFS共享在客户端挂载为/share1。用户名和密码存储在/home/jay/.smb_auth中。我在此处还设置了挂载文件的UID和GID。

通用格式为:

//<server_ip_addr>/<cifs_share_name> <local_mount_point> cifs credentials=<pw_file>,uid=<UID>,gid=<GID>,iocharset=<charset> 0 0

之后,只需使用命令

sudo mount /share1

即可挂载共享。实际上,如果不希望客户端在系统启动时自动挂载共享,可能需要在挂载选项中添加noauto。或者,可以在启动时自动挂载,并(假设一切顺利)在Go程序启动前已经挂载好共享。

在启动时挂载CIFS共享并不总是顺利,因此在Go程序中,可能需要检查共享是否可用,并在必要时进行挂载。

在 Linux 下使用 syscall.Mount() 挂载共享文件夹(如 NFS 或 CIFS)时,需要正确指定文件系统类型、挂载选项和目标路径。以下是具体实现示例:

package main

import (
    "fmt"
    "syscall"
)

func main() {
    source := "192.168.1.100:/shared"  // NFS 共享路径
    target := "/mnt/shared"            // 本地挂载点
    fstype := "nfs"                    // 文件系统类型
    flags := 0                         // 挂载标志
    data := ""                         // 文件系统特定数据

    err := syscall.Mount(source, target, fstype, uintptr(flags), data)
    if err != nil {
        fmt.Printf("挂载失败: %v\n", err)
        return
    }
    fmt.Println("共享文件夹挂载成功")
}

对于 CIFS/SMB 共享文件夹,需要调整参数:

func mountCIFS() {
    source := "//192.168.1.100/share"   // CIFS 共享路径
    target := "/mnt/cifs"               // 本地挂载点
    fstype := "cifs"                    // 文件系统类型
    flags := 0                          // 挂载标志
    data := "username=user,password=pass" // 认证信息

    err := syscall.Mount(source, target, fstype, uintptr(flags), data)
    if err != nil {
        fmt.Printf("CIFS 挂载失败: %v\n", err)
        return
    }
    fmt.Println("CIFS 共享文件夹挂载成功")
}

关键参数说明:

  • source: 共享文件夹的网络路径
  • target: 本地挂载点目录(需提前创建)
  • fstype: 文件系统类型(nfs、cifs、smb3 等)
  • flags: 挂载选项,如 syscall.MS_RDONLY 用于只读挂载
  • data: 文件系统特定选项,如认证信息、挂载参数

卸载挂载点使用 syscall.Unmount()

err := syscall.Unmount("/mnt/shared", 0)
if err != nil {
    fmt.Printf("卸载失败: %v\n", err)
}

注意:执行挂载操作通常需要 root 权限,确保程序以足够权限运行。

回到顶部