平常我们编写的代码都不会需要较高的权限,但是最近调试的一个程序,需要在 kubelet 的目录下创建 socket 文件,需要用到 root 权限,搜索一番才解决,记录一下。
Visual Studio Code
我目前大部分的工作都是用 vscode 来完成了,根据官方文档,居然没找到以 root 调试相关的配置,立马上 github 查找,找到网友之前的一些做法,通过 pkexec 实现,但是不太靠谱,最终发现比较新的版本里 Go 插件已经提供了这项能力,不过还是需要再 /etc/sudoer.d 目录中增加一些看起来“脏”的配置,但这确实是必须的。好了长话短说,直接开整。
launch.json
的配置
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"envFile": "${workspaceFolder}/.env",
"console": "integratedTerminal",
"asRoot": true,
}
/etc/sudoers.d
中的配置
sudo tee /etc/sudoers.d/golang > /dev/null <<EOF
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/root/bin:/usr/local/go/bin:/home/username/go/bin/"
username ALL=(root)NOPASSWD:/home/username/go/bin/dlv
username ALL=(root)NOPASSWD:/home/username/go/bin/dlv-dap
EOF
Intellij IDEA/GoLand
直接在 Run/Debug Configuration 中勾上 “Run with sudo” 即可,不过如果你是在远程开发中(如 JetBrains Gateway),目前还会遇到 pkexec 的错误,暂时未修复。
提示
既然都需要 root 权限了,必然需要一些特殊的配置,在可以接受的情况下,需要对操作系统做一些修改才可以,因此,比较建议大家使用容器化的容器来做这样的修改(例如 Gitpod)。以免风险侵入。