루트가 아닌 사용자로 분기 및 복제할 수 있는 단일 프로세스를 실행합니다.

루트가 아닌 사용자로 분기 및 복제할 수 있는 단일 프로세스를 실행합니다.

"/proc/self/exe"를 호출하여 자체 복제본을 포크하는 단일 운영 체제 프로세스를 실행하는 도커 컨테이너를 실행하고 싶습니다. 이 프로세스는 컨테이너 사용자(시스템 사용자 또는 로그인한 사용자 중 더 안전한 사용자)에 의해 시작됩니다. 이를 위해 나는믿다CLONE_NEWUTS 비트가 설정된 파일에서 프로세스를 실행하거나 슈퍼유저가 프로세스를 시작하도록 해야 합니다.

sudo 기능이 있는 사용자를 사용하고 싶지 않으며 파일에 CAP_SYS_ADMIN 비트를 설정하고 싶지도 않습니다. CLONE_NEWUTS 비트에는 특정 기능이 없기 때문입니다.

다음은 몇 가지 코드입니다.

package main

import (
  "os"
  "os/exec"
  "syscall"
  "fmt"
)

func main() {
  // this would not be a main, it would be a process listening on a channel piped into from serveHTTP
  switch os.Args[1] {
  case "run":
    run()
  case "child":
    child()
  default:
    panic("Unknown command")
  }
}

func run() {
  // fork a _clone_ process off in the command (execute the self process)
  cmd := exec.Command("/proc/self/exe", append([]string{"child"}, os.Args[2:]...)...)
  cmd.Stdin = os.Stdin
  cmd.Stdout = os.Stdout
  cmd.Stderr = os.Stderr
  cmd.SysProcAttr = &syscall.SysProcAttr{
    Cloneflags:  syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID,
  }

  if err := cmd.Run(); err != nil {
    panic(err)
  }
}

func child() {
  // this would be one of the action functions
  fmt.Printf("running %v as %v\n", os.Args[2:], os.Getpid())

  cmd := exec.Command(os.Args[2], os.Args[3:]...)
  cmd.Stdin = os.Stdin
  cmd.Stdout = os.Stdout
  cmd.Stderr = os.Stderr
  if err := cmd.Run(); err != nil {
    panic(err)
  }
}

훌륭한 강연에서 가져온 것이지만 지금은 링크를 찾을 수 없습니다. 다른 기계의 기록에 있습니다.

이 잘못 표현된 질문에서:수퍼유저가 아닌 실행 프로세스가 스스로 포크 및 복제하도록 허용(중복 가능)@sourcejedi는 내 계획에서 위의 문제를 부분적으로 명확하게 설명했습니다.

관련 정보