通过Python为bash脚本密码创建窗口
我正在编写一个由图形用户界面组成的脚本。这个GUI有一个用户单击的按钮,它执行托管在DropBox上的bash脚本。然后,我将bash脚本的输出写入日志文件通过Python为bash脚本密码创建窗口,python,bash,subprocess,Python,Bash,Subprocess,我正在编写一个由图形用户界面组成的脚本。这个GUI有一个用户单击的按钮,它执行托管在DropBox上的bash脚本。然后,我将bash脚本的输出写入日志文件 path = os.path.expanduser('~') + '/Desktop/' cmd = 'curl -fsSL https://www.dropbox.com/BASH_SCRIPT_dl=1 | bash' with open(path+'Step 1 Log.txt', 'w') as out: process =
path = os.path.expanduser('~') + '/Desktop/'
cmd = 'curl -fsSL https://www.dropbox.com/BASH_SCRIPT_dl=1 | bash'
with open(path+'Step 1 Log.txt', 'w') as out:
process = subprocess.Popen(cmd, shell=True, stdout=out, stderr=out)
print('Step 1 completed. Continue onto Step 2.\n\n')
我遇到的问题是,这个bash脚本包含sudo命令(用于处理安装新软件的权限)。当bash脚本到达sudo命令时,没有终端窗口可以输入密码。目前,生成的日志文件显示了sudo命令之前所有bash命令的结果。我假设bash脚本只是终止
我想到的一个可能的解决方法是在脚本开始时让用户输入密码,将其保存为变量,然后在Popen命令中传递密码。然而,我对Popen.communicate()方法的所有研究都让我感到困惑。我还研究了pexpect库,但我更喜欢使用stdlib解决方案
无论如何,我更希望用户在bash脚本提示时只需输入密码。我正在运行Python3.4,但一旦完成,我将把整个项目移植回2.7(MacBooks上的本机Python版本)
编辑:
感谢Etan Reisner的建议。我对bash脚本的了解有限,这是我的一位同事写的。包含sudo命令的函数如下所示:
function setsudo() {
echo -e "\nPlease enter your laptop password: "
sudo -v
if [[ ${?} -ne 0 ]] ; then
echo "!! User Password not accepted, exiting....!!"
exit 1;
fi
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
}
我正在阅读sudo手册,并在终端中四处玩耍,以了解应该用什么来取代sudo-v。
-A
的具体实现方式是什么?这就是sudo
-A
参数的作用:
-A
通常,如果sudo需要密码,它会从用户的帐户中读取密码
终点站。如果指定了-A(askpass)选项,则
执行图形)帮助程序以读取用户的密码和
将密码输出到标准输出。如果SUDO_ASKPASS
如果设置了环境变量,它将指定辅助对象的路径
程序。。。。如果没有可用的askpass程序,sudo将退出
有一个错误
不要在脚本中使用sudo,只需检查您是否是os.getuid()==0的root用户,如果是,则会出错not@user2085282建议以root身份运行整个脚本比只运行需要root作为root的命令要好不是一个特别好的建议。为什么不直接查找用户的主目录,或者干脆
os.path.expanduser(“~”)
?为什么要调用str
,因为它要么什么都不做(如果它已经是一个字符串),要么会引起混乱的悲伤(如果它是某种原因,例如字节,那么你最终会以/Users/b'me'/Desktop
作为你的路径)?为什么要将命令行pipingcurl
写入bash
,而不仅仅是使用子流程管道(以及,urllib
或请求
)?为什么要将open
放在with
语句前面,更糟糕的是,为什么要在后面调用close
?所有这些都使得调试代码变得更加困难。我不知道os.path.expanduser
方法,谢谢你指出这一点。在我的脚本之前,cmd
变量是在终端中手动输入的;我试图通过GUI实现自动化,所以这是当时我想到的最简单的过程。至于.close()
,我将修改我的代码以消除它,感谢您的编辑。setsudo()
的目的是,无论调用它的脚本花费多长时间,都只要求输入一次密码。请看,特别是。谢谢,我将对此进行调查并更新。你有文档的链接吗?编辑:没关系,我找到了。@user3239106:有几件事需要注意:(1)如果你只关心自己的平台,那么这个问题的答案通常是mansudo
。(2) 如果您关心跨平台,通常您希望搜索站点:pubs.opengroup.org sudo
,因为这样会很快找到POSIX标准文档…但是在这种情况下,。sudo-A可能存在问题:sudo-A
:它可能会清除sudo超时,从而导致脚本中的每个sudo
调用都启动sudo\u ASKPASS
程序。看见