Python中文
首页
教程
问答
标签
搜索
登录
注册
如何用sudo杀死用Popen调用的shell脚本?
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我用Python编写了一个gtkgui应用程序,只需调用一个shell脚本,并将调用参数从GUI传递给脚本,并在文本窗口中返回脚本结果。在</p> <p>现在我想允许用户从GUI中取消正在运行的shell脚本。脚本以Popen开头。如果我以普通用户的身份调用它,它可以正常工作(在下面的代码中标记sudo=False)。当我使用sudo调用脚本时,我不能再取消它了。我发现如果我使用shell=True,那么报告kill的人就不起作用了,所以我用shell=False测试了它,但是它也不起作用。在</p> <p>我将问题归结为以下代码片段:</p> <pre><code>import os import signal import subprocess import time import sys import shlex bashScriptFileName="t.sh" f = open(bashScriptFileName,'w') f.write("""#!/bin/bash on_die() { echo "Dying..." exit 0 } trap 'on_die' TERM SEC=0 while true ; do sleep 1 SEC=$((SEC+1)) echo "I'm PID# $$, and I'm alive for $SEC seconds now!" done exit 0""") f.close() os.chmod(bashScriptFileName, 0755) shell=True # flag to enable/disable shell invocation of Popen sudo=True # flag to invoke command with sudo if sudo: commandToExecute='sudo -S '+ bashScriptFileName else: commandToExecute='./' + bashScriptFileName if not shell: commandToExecute = shlex.split(commandToExecute) print "Command: %s" % (commandToExecute) proc = subprocess.Popen(commandToExecute, stdin=subprocess.PIPE, close_fds=False,shell=shell, preexec_fn=os.setsid) print >> proc.stdin, "secretPassword" print 'PARENT : Pausing before sending signal to child %s...' % proc.pid sys.stdout.flush() time.sleep(5) print 'PARENT : Signaling child %s' % proc.pid sys.stdout.flush() os.killpg(proc.pid, signal.SIGTERM) time.sleep(3) print "Done" </code></pre> <p>事实上,作为一个普通用户,我已经遇到了一些问题os.杀死但后来发现我不得不用操作系统集UID然后杀了那个跑来跑去的炮弹。我是线程新手,从我的角度来看,这可能只是一个简单的Linux线程错误。。。在</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>如果你用sudo启动它,你必须拥有root权限才能杀死它。基本上,你必须:</p> <pre><code>os.system("sudo kill %d"%(pid)) </code></pre> <p>另外,出于安全考虑,我建议您将bash脚本创建为root,将其放在任何方便的地方,不给用户写访问权限,最后设置sudo来运行它,而不需要密码。这样就不需要在这个python脚本中存储密码了。在</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何添加虚拟方法
4 回答
如何添加表示整数的擦边字符串?
8 回答
如何添加要在Bokeh中使用的新font.ttf文件?
1 回答
如何添加要显示的矩阵XY轴编号和XY轴
6 回答
如何添加计数?
6 回答
如何添加计数器函数?
7 回答
如何添加计数器列来计算数据帧中另一列中的特定值?
3 回答
如何添加计数器来跟踪while循环中的月份和年份?
9 回答
如何添加计数并删除countplot的顶部和右侧脊椎?
7 回答
如何添加计时器wx.应用程序更新窗口对象的主循环?
1 回答
如何添加评论到帖子?PostDetailVew,Django 2.1.5
7 回答
如何添加评论拉梅尔亚姆
5 回答
如何添加诸如矩阵Python/Pandas之类的数据帧?
10 回答
如何添加谷歌地点自动完成到Flask?
3 回答
如何添加超时、python discord bot
4 回答
如何添加超过1dp的检查
6 回答
如何添加距离方法
8 回答
如何添加跟随游戏的敌人精灵
3 回答
如何添加路径以便python可以找到程序?
2 回答
如何添加身份验证/安全性以使用happybase访问HBase?
6 回答