非rootユーザーとして分岐および複製できる単一のプロセスを実行します。

非rootユーザーとして分岐および複製できる単一のプロセスを実行します。

「/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は私の計画で上記の問題を部分的に明確に説明しました。

ベストアンサー1

おすすめ記事