Sudo

sudo setsid command不會產生新的程序組?

  • December 15, 2017

我正在研究一個我想在sudo軟體測試中執行程序/命令的場景。這些命令是從基於subprocess模組的 Python 腳本啟動的。我試圖避免必須以超級使用者權限執行整個測試套件。

假設出於本範例的目的,它是top. 我的命令啟動了它自己的一些子程序,並且可能會陷入死鎖。超時後,我想殺死它(和它的孩子)。顯而易見的解決方案似乎是讓我的命令負責一個新的會話/程序組,允許我一次完全殺死它及其子程序。我不知道如何使它與sudo. 在我的情況下,sudo總是無一例外地受到密碼保護,我想保持這種方式……如果可能的話。

  1. 作品:setsid top
  2. 有效,但不會產生新的程序組:sudo setsid top
  3. 有問題 - 很難以安全可靠的方式獲取 root 密碼:setsid sudo top

我沒有設法使(3)以乾淨的方式工作。我搞砸了SUDO_ASKPASS

令我驚訝的是 (2) 實際執行但沒有給我所需的新程序組。

systemd─┬─ ...
       ├─kdeinit5─┬─ ...
       │          └─yakuake─┬─2*[bash]
       │                    ├─bash───sudo───top
       │                    ├─bash───pstree
       ...

場景 2 可以這樣修復,無需使用setsid

sudo -b command

sudo這將在系統的 init 程序(包括命令)的正下方創建一個新程序組。


不過,有一點建議:如果使用 Python 啟動這樣的程序組,則生成subprocess.Popen的對象PID(團體)。我的解決方法(需要):subprocess.Popen(...).pid``PGID``kill -9 -- -{PGID}``psutil

import os
import psutil
import subprocess

def __get_pid__(cmd_line_list):
   for pid in psutil.pids():
       proc = psutil.Process(pid)
       if cmd_line_list == proc.cmdline():
           return proc.pid
   return None

cmd = ['sudo', '-b', 'command']
cmd_proc = subprocess.Popen(cmd)

print('Wrong PGID: %d' % os.getpgid(cmd_proc.pid))
print('Right PGID: %d' % os.getpgid(__get_pid__(cmd)))

引用自:https://unix.stackexchange.com/questions/411036