Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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为bash脚本密码创建窗口_Python_Bash_Subprocess - Fatal编程技术网

通过Python为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 =

我正在编写一个由图形用户界面组成的脚本。这个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 = 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
作为你的路径)?为什么要将命令行piping
curl
写入
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
程序。看见