使用Go

时间:2018-02-16 14:59:23

标签: linux security go mount

在Linux中,我可以像这样以编程方式安装网络位置:

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. 提升权限,我就无法运行此功能
  3. 用户名和密码将由用户提供。这似乎非常不安全。 任何人都可以确认这种方法的安全性或危险性吗?
  4. 这是一个类似的变量方法:

    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()函数转义了美元符号,因此env变量中的值不会替换。所以这似乎表明某种类型的安全或逃避在这里。

    编辑etc/fstab文件可让我在没有mount的情况下运行sudo,但我需要sudo来编辑fstab 1}}文件,所以回到原点。

1 个答案:

答案 0 :(得分:0)

我们可以使用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命令就是这样工作的。