我正在推出一个使用的程序 subprocess.Popen(cmd, shell=TRUE)
我对Python很新,但感觉就像应该有一些api让我做类似的事情:
subprocess.Popen(cmd, shell=TRUE, postexec_fn=function_to_call_on_exit)
Run Code Online (Sandbox Code Playgroud)
我这样做是为了function_to_call_on_exit能够在知道cmd退出的基础上做一些事情(例如保持当前正在运行的外部进程数的计数)
我假设我可以相当简单地将子进程包装在一个将线程与Popen.wait()方法结合起来的类中,但是因为我还没有在Python中进行线程化,而且看起来这可能是一个常见的API存在,我想我会先尝试找一个.
提前致谢 :)
我正在运行一个userA与root访问一样的脚本,从这个脚本我想popen()打电话并运行一个不同的进程userB.
os.setuid()似乎不适用于此(除非我这样做错了吗?),我想避免基于linux的解决方案,如 su -userB -c <command>
userB在脚本运行时是否有运行进程的pythonic方法userA?
我正在写一个简单的脚本,重启一个hadoop奴隶.在脚本中,我必须以root用户身份进行一些初始更改.之后,我必须更改为用户"hadoop"并执行一组命令.我使用os.system来运行命令,但我怀疑它是否运行良好.例如:
uid=pwd.getpwnam('hadoop')[2]
os.setuid(uid)
os.system('whoami')
os.chdir('/home/hadoop/hadoop/')
os.system('bin/hadoop-daemon.sh stop tasktracker')
Run Code Online (Sandbox Code Playgroud)
在此之后,我必须以root身份执行一些命令,然后再次成为用户"hadoop"并执行:
os.system('bin/hadoop-daemon.sh stop tasktracker')
Run Code Online (Sandbox Code Playgroud)
我这里有三个问题,
os.system是我用来发出linux命令的最佳命令吗?
我可以通过上面的命令从root用户更改为用户hadoop但我无法更改为root用户(我可以理解,如果他们允许这样做会有安全问题,我想知道有没有可能做到这一点,至少通过密码)?
os.setuid()有用吗?whoami打印用户hadoop,但进程"tasktracker"没有停止使用这些命令,但如果我手动执行相同的命令它工作正常(我手动尝试时使用"su hadoop"而不是setuid).
感谢你的帮助.
python 3.6我正在尝试以不同的用户身份执行命令,popen但subprocess它仍然会以调用脚本的用户身份执行(我计划将其称为 root)。我正在使用线程,因此当两个线程并行执行时,不要侵犯用户权限,这一点很重要。
proc = subprocess.Popen(['echo $USER; touch myFile.txt'],
shell=True,
env={'FOO':'bar', 'USER':'www-data'},
stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
上面的例子仍然会用myFile.txt我的user_id 1000
我尝试了不同的方法:
尝试按照与长时间运行的Python进程不同的用户身份运行子进程中所述,通过复制os.environment并更改用户等
(注意这是针对python 2)
按照https://docs.python.org/3.6/library/subprocess.html#popen-constructor中的描述尝试使用start_new_session=True
我的最后一个选择是在命令前加上前缀sudo -u username command,但我认为这不是优雅的方式。
python ×4
linux ×2
subprocess ×2
callback ×1
exit ×1
hadoop ×1
os.system ×1
popen ×1
python-3.x ×1