在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()
}
问题:
sudo
这是一个类似的变量方法:
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}}文件,所以回到原点。
答案 0 :(得分:0)
我们可以使用gvfs
在userspace
中装载共享,这意味着我们不需要使用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
命令就是这样工作的。