Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
行为不端的python sys脚本_Python_Linux - Fatal编程技术网

行为不端的python sys脚本

行为不端的python sys脚本,python,linux,Python,Linux,我制作了这个用于更新系统的小python脚本(但还没有放入所有命令,只是想尝试一个更新命令),但它在进入root/superuser模式后会出现错误 我想知道是否有人能指出这个问题/bug import os print "\t Entering Upgrade Mode " if os.system("su")==1: print "passed" os.system("apt-get update") os.system(exit) else:

我制作了这个用于更新系统的小python脚本(但还没有放入所有命令,只是想尝试一个更新命令),但它在进入root/superuser模式后会出现错误

我想知道是否有人能指出这个问题/bug

import os

print "\t Entering Upgrade Mode "

if os.system("su")==1:
      print "passed"
      os.system("apt-get update")
      os.system(exit)
else:
      print "failed"

我怀疑呼叫
su
就是问题所在。直到您退出子shell(在本例中,将您从root注销),调用才会退出。这意味着任何后续调用都将作为(可能的)正常用户再次执行

请尝试以下操作:

import os

print "\t Entering Upgrade Mode "

os.system("sudo apt-get update")
或者,
su
需要
-c
标志来处理后续命令,例如:

su -c "echo Hello" 

您可能应该使用
子流程
<代码>操作系统。系统已弃用

也许是你让apt get update调用了你的脚本?脚本名为
su
吗?不,它名为l_update它打印
通过了
,这很奇怪,现在它只进入root模式,既不打印passed也不打印failed我很确定注销root会解除脚本的阻塞只是偶然的。
system
调用将命令分派给运行Python代码的shell的子shell,然后阻塞,直到该子shell返回。运行
su
的子shell在您退出它之前不会返回,因此Python程序会无限期地阻止
系统的调用。@sr2222-我们说的是同一件事,我可能应该使用更精确的措辞:当我说注销root时,我指的是注销子shell,即键入exit!是的,就像你说的那样,问题出在提升特权上,而不是还在运行的子shell。@sr2222-好电话-我修改了措辞;希望这一点现在更清楚了。如果您使用subprocess,那么您可以绑定到i/o流并与subshell交互工作,而不阻塞Python脚本,这可能对此类脚本很有帮助。