读取 /proc/pid/smaps 文件 (golang) 时权限被拒绝
Permission denied while reading /proc/pid/smaps file (golang)
使用 os/exec
包,我想 运行 在 *nix OS 上使用另一个用户而不是 root 的外部命令。 (root用户下的主进程运行s).
go app 的外部命令运行s。但是我的应用程序无法读取 /proc/pid/smaps
文件,出现以下错误:
panic: open /proc/2962/smaps: permission denied
goroutine 6 [running]:
main.memwatch(0xc000094000, 0xc00007a0c0)
/src/main.go:41 +0x298
created by main.main
/src/main.go:25 +0x18f
exit status 2
这是我的代码:
// main.go
package main
import (
"fmt"
"os"
"os/exec"
"syscall"
"time"
)
func main() {
cmd := exec.Command("sleep", "3")
cmd.SysProcAttr = &syscall.SysProcAttr{
Setpgid: true,
Credential: &syscall.Credential{Uid: 65534, Gid: 65534}, // External command expect run with `nobody` instead of `root` for security reason
}
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Start()
done := make(chan struct{})
go memwatch(cmd, done)
if err != nil {
panic(err)
}
cmd.Wait()
close(done)
}
func memwatch(cmd *exec.Cmd, done <-chan struct{}) {
// Reuse the reader so we don't have to close and reopen it all the time
smaps, err := os.Open(fmt.Sprintf("/proc/%d/smaps", cmd.Process.Pid))
if err != nil {
panic(err)
}
defer smaps.Close()
for {
select {
case <-done:
return
default:
fmt.Println("running")
time.Sleep(10 * time.Millisecond)
}
}
}
我累了。请任何人在这里寻求帮助。
我在没有 SYS_PTRACE
功能的 docker 容器中测试我的代码。这就是错误显示的原因。当我为该容器添加 SYS_PTRACE
功能时错误消失了。
使用 os/exec
包,我想 运行 在 *nix OS 上使用另一个用户而不是 root 的外部命令。 (root用户下的主进程运行s).
go app 的外部命令运行s。但是我的应用程序无法读取 /proc/pid/smaps
文件,出现以下错误:
panic: open /proc/2962/smaps: permission denied
goroutine 6 [running]:
main.memwatch(0xc000094000, 0xc00007a0c0)
/src/main.go:41 +0x298
created by main.main
/src/main.go:25 +0x18f
exit status 2
这是我的代码:
// main.go
package main
import (
"fmt"
"os"
"os/exec"
"syscall"
"time"
)
func main() {
cmd := exec.Command("sleep", "3")
cmd.SysProcAttr = &syscall.SysProcAttr{
Setpgid: true,
Credential: &syscall.Credential{Uid: 65534, Gid: 65534}, // External command expect run with `nobody` instead of `root` for security reason
}
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Start()
done := make(chan struct{})
go memwatch(cmd, done)
if err != nil {
panic(err)
}
cmd.Wait()
close(done)
}
func memwatch(cmd *exec.Cmd, done <-chan struct{}) {
// Reuse the reader so we don't have to close and reopen it all the time
smaps, err := os.Open(fmt.Sprintf("/proc/%d/smaps", cmd.Process.Pid))
if err != nil {
panic(err)
}
defer smaps.Close()
for {
select {
case <-done:
return
default:
fmt.Println("running")
time.Sleep(10 * time.Millisecond)
}
}
}
我累了。请任何人在这里寻求帮助。
我在没有 SYS_PTRACE
功能的 docker 容器中测试我的代码。这就是错误显示的原因。当我为该容器添加 SYS_PTRACE
功能时错误消失了。