在python脚本中更改为sudo用户

Kra*_*n18 24 python security sudo

我有个问题.我正在编写一个软件,它需要执行一个操作,要求用户处于sudo模式.运行'sudo python filename.py'不是一个选项,这引出了我的问题.有没有办法在python脚本的一半更改为sudo,安全性不是问题,因为用户将通过以下方式知道程序应该运行的sudo密码来说明问题

  1. 程序作为普通用户运行
  2. ......执行操作
  3. 用户输入sudo密码
  4. 用户改为sudo
  5. 运行需要sudo权限的子程序
  6. 在触发偶数(子程序结束)用户再次成为普通用户
  7. ......执行操作

我的问题在于第3步,你可以建议的任何指针或框架都会有很大的帮助.

干杯

克里斯

nea*_*mcb 18

最好使用提升的权限尽可能少地运行程序.您可以通过该subprocess.call()功能运行需要更多权限的小部分,例如

import subprocess
returncode = subprocess.call(["/usr/bin/sudo", "/usr/bin/id"])
Run Code Online (Sandbox Code Playgroud)


Jak*_*yer 9

不要尝试让自己sudo只是检查你是否和错误,如果你没有

class NotSudo(Exception):
    pass

if os.getuid() != 0:
    raise NotSudo("This program is not run as sudo or elevated this it will not work")
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个非常好的解决方案 - 如果只有部分脚本需要root,该怎么办? (22认同)
  • 这不应该是`os.geteuid()!= 0`? (4认同)
  • 特别要求不运行整个程序的问题得到提升. (3认同)
  • 知道sudo的@JakobBowyer还会在身边吗? (2认同)
  • @thorr18 其他站点反对在旧线程中发帖,但堆栈溢出已经看到了曙光,并鼓励提出问题并提供对以后其他人有用的答案,这意味着修复或指出旧答案的问题很重要。 (2认同)

小智 5

我最近在制作系统安装脚本时处理了这个问题.要切换到超级用户权限,我使用subprocess.call()和'sudo':

#!/usr/bin/python

import subprocess
import shlex
import getpass

print "This script was called by: " + getpass.getuser()

print "Now do something as 'root'..."
subprocess.call(shlex.split('sudo id -nu'))

print "Now switch back to the calling user: " + getpass.getuser()
Run Code Online (Sandbox Code Playgroud)

请注意,您需要使用shlex.split()命令使其可用subprocess.call().如果要使用命令的输出,可以使用subprocess.check_output().还有一个名为'sh'的软件包(http://amoffat.github.com/sh/),您可以将其用于此目的.


and*_*rew 2

使用Tcl和Expect,再加上subprocess来提升自己。所以基本上是这样的:

须藤.tcl

spawn sudo
expect {
    "Password:" {
        send "password"
    }
}
Run Code Online (Sandbox Code Playgroud)

须藤.py

import subprocess
subprocess.call(['tclsh', 'sudo.tcl'])
Run Code Online (Sandbox Code Playgroud)

然后运行 ​​sudo.py。