使用 SSL 在 apache 上运行 django 应用程序:pexpect spawn/expect 不起作用
Posted
技术标签:
【中文标题】使用 SSL 在 apache 上运行 django 应用程序:pexpect spawn/expect 不起作用【英文标题】:running a django app on apache with SSL: pexpect spawn/expect doesn't work 【发布时间】:2016-04-13 00:25:12 【问题描述】:我在启用 SSL 的 apache 2.2 上运行 django 应用程序。当我没有启用 SSL 时,一切都很好。但是在安全方面,操作系统如何分叉进程等方面可能存在一些限制。我根本不知道这些。
使用的操作系统:Solaris(不确定是否重要,但可以) Django v1.4、Apache 2.2、Python 2.7
以我的观点概述我正在做的事情:
def run_step(请求,操作): 如果(动作==“动作1”): p = subprocess.Popen("command1", 壳=真,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) elif (action == "action2"): 密码 = mylib.getpasswd() ## 方法1:使用pexpect command = pexpect.spawn('su root -c \' command2 \'') command.expect('[pP]assword*') command.sendline(密码) ## 方法2:使用子进程和一个简单的命令 #command = subprocess.Popen('ls > log.file', shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) ## 方法3:使用子进程stdin PIPE #command = subprocess.Popen('command2', shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT,stdin=subprocess.PIPE) #command.stdin.write(密码) #command.communicate() ## 我尝试使用 shell = False, ## 也带有 stdin.flush() 和通信(密码)。“Action1”的命令执行得非常好。但是那些需要像'Action2'这样的交互的问题。 我尝试了三种不同的方法:
方法 1:像往常一样使用 pexpect 发送它,但它失败了 - 该命令根本没有得到执行。 方法 2:尝试了没有交互的子进程调用 - 有效。 方法 3:尝试使用标准输入管道进行子进程调用以尝试交互,但再次失败。我现在不知道该怎么做。非常感谢任何帮助。
【问题讨论】:
【参考方案1】:这对我有用:
使用 python 中的 'threading' 模块将 pexpect 调用作为单独的线程生成,然后使用 sendline 发送密码。
import threading
command = 'ls -l' #some_command
t = threading.Thread(target=some_function,args=(command,))
t.start()
def some_function(command):
some_process = pexpect.spawn(command)
some_process.expect('[pP]assword*')
some_process.sendline(some_password)
some_process.expect(pexpect.EOF,timeout=1000)
我仍然不明白为什么 pexpect 模块在主线程上不起作用。仍然会感谢任何答案,但我现在要使用这个解决方案。
【讨论】:
以上是关于使用 SSL 在 apache 上运行 django 应用程序:pexpect spawn/expect 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 Dataflow 上运行的 Apache Beam 管道无法从 KafkaIO 读取:SSL 握手失败
在端口 80 上为 Tomcat 和在 8080 上的 Apache 使用相同的 SSL 证书
如何使用别名在 Apache 虚拟主机上配置多个 SSL 证书?