平常我们编写的代码都不会需要较高的权限,但是最近调试的一个程序,需要在 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)。以免风险侵入。

参考

  1. https://github.com/golang/vscode-go/issues/558
  2. https://github.com/microsoft/vscode-go/issues/2889
  3. https://youtrack.jetbrains.com/issue/CPP-25441/The-process-is-exited-with-exit-code-1-when-run-Debug-on-remote-host-with-administrative-privileges

Leave a Reply

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据