gpt4 book ai didi

linux - 使用 Go 在 Linux 中以编程方式安全地挂载网络位置

转载 作者:数据小太阳 更新时间:2023-10-29 03:23:30 25 4
gpt4 key购买 nike

在 Linux 中,我可以像这样使用 Go 以编程方式挂载网络位置:

func main() {
var user, pass string
fmt.Println("username:")
fmt.Scanln(&user) // ignore errors for brevity
fmt.Println("password:")
fmt.Scanln(&pass)

cmd := exec.Command("mount", "-t", "cifs", "-o", "username="+user+",password="+pass, "//server/dir", "media/dir")
cmd.Run()
}

问题:

  1. 如果不使用 sudo 提升权限,我无法运行它
  2. 用户名和密码将由用户提供。这似乎很不安全。 谁能确认这种方法的安全性或危险性?

这是一个类似的变量方法:

cmd := exec.Command("mount", "-t", "cifs", "-o", "username=$USER,password=$PASS", "//server/dir", "media/dir")
cmd.Env = []string{"USER="+user, "PASS="+pass}
cmd.Run()

那行不通。 exec.Command() 函数似乎转义了美元符号,因此环境变量中的值没有在那里被替换。所以这似乎表明这里正在进行某种安全或逃避。

编辑 etc/fstab 文件 将允许我在没有 sudo 的情况下运行 mount 但随后我会需要 sudo 来编辑 fstab 文件,回到正题。

最佳答案

我们可以使用 gvfsuserspace 中挂载共享,这意味着我们不需要使用 sudo 提升权限。 gio 命令可用于此目的。

为简洁起见,下面的代码片段排除了错误处理:

cmd := exec.Command("gio", "mount", "smb://server/share")
inPipe, _ := cmd.StdinPipe()
cmd.Start()

// Get credentials whichever way you find best, including scanning the Stdin.
// Concatenate them together with line breaks in between and a line break at the end.
auth := "Username\nDomain\nPassword\n"
inPipe.Write([]byte(auth))

// Wait for the command to finish.
cmd.Wait()

扫描 Stdin 似乎是一种可接受的捕获凭据的方式,因为这就是 gio 命令的工作方式。

关于linux - 使用 Go 在 Linux 中以编程方式安全地挂载网络位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48829420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com