Python中以不同用户身份运行进程*并*打印退出代码

13 浏览
0 Comments

Python中以不同用户身份运行进程*并*打印退出代码

我正在以root身份运行Python脚本,从这个脚本中,我想以userA身份运行linux进程。有很多关于如何这样做的答案但是我还需要打印从进程收到的退出码,这才是真正的问题。是否有一种方式以userA的身份运行进程并打印返回值?

os.system("su userA -c 'echo $USER'")
answer = subprocess.call(["su userA -c './my/path/run.sh'"])
print(answer)

admin 更改状态以发布 2023年5月21日
0
0 Comments

如果您使用os.fork(并在子进程中使用os.setuid),则可以使用os.waitpid收集状态。

pid = os.fork()
if pid == 0:
    os.setgid(...)
    os.setgroups(...)
    os.setuid(...)
    # do something and collect the exit status... for example
    #
    # using os.system:
    #
    #      return_value = os.system(.....) // 256
    #
    # or using subprocess:
    #
    #      p = subprocess.Popen(....)
    #      out, err = p.communicate()
    #      return_value = p.returncode
    #
    # Or you can simply exec (this will not return to python but the 
    # exit status will still be visible in the parent).  Note there are 
    # several os.exec* calls, so choose the one which you want.
    #
    #      os.exec...
    #
    os._exit(return_value)
pid, status = os.waitpid(pid, 0)
print(f"Child exit code was {status // 256}")

这里我最近发布了答案,回答了一个相关的问题,该问题不是关注返回值,而是包括一些您可能传递给os.setuid等调用的值的更多细节。

0
0 Comments

当您运行脚本并想打印其返回代码时,必须等待其执行完成后执行打印命令。subprocess模块允许您生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码。\n参考http://docs.python.org/library/subprocess.html\n在您的情况下:

    import subprocess
    process = subprocess.Popen('su userA -c ./my/path/run.sh', shell=True, stdout=subprocess.PIPE)
    process.wait()
    print process.returncode

\n参考https://stackoverflow.com/a/325474/13798864

0