运行 带 SSL 的 apache 上的 django 应用程序:pexpect spawn/expect 不工作
running a django app on apache with SSL: pexpect spawn/expect doesn't work
我是 运行 启用 SSL 的 apache 2.2 上的 django 应用程序。当我没有启用 SSL 时,一切都很好。但是出于安全考虑,可能对 os 如何分叉进程等有一些限制。我根本不知道 ose。
OS 使用:Solaris(不确定是否重要,但可能)
Django v1.4、Apache 2.2、Python 2.7
在我的观点之一中概述我正在做的事情:
def run_step(request, action):
if (action == "action1"):
p = subprocess.Popen("command1",
shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
elif (action == "action2"):
password = mylib.getpasswd()
## Method 1: with pexpect
command = pexpect.spawn('su root -c \' command2 \'')
command.expect('[pP]assword*')
command.sendline(password)
## Method 2: with subprocess and a simple command
#command = subprocess.Popen('ls > log.file',
shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
## Method 3: with subprocess stdin PIPE
#command = subprocess.Popen('command2', shell=True,
stdout=subprocess.PIPE,stderr=subprocess.STDOUT,stdin=subprocess.PIPE)
#command.stdin.write(password)
#command.communicate()
## I tried with shell = False,
## with stdin.flush() and communicate(password) too.
'Action1' 的命令执行得很好。但是 those 的问题需要像 'Action2' 那样的交互。
我尝试了三种不同的方法:
- 方法 1:像往常一样使用 pexpect 发送它但它失败了 - 命令根本没有执行。
- 方法 2:尝试了没有交互的子进程调用 - 有效。
- 方法 3:尝试使用标准输入管道进行子进程调用以尝试交互但再次失败。
我现在不确定该怎么做。任何帮助将不胜感激。
以下是对我有用的方法:
使用 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 2.2 上的 django 应用程序。当我没有启用 SSL 时,一切都很好。但是出于安全考虑,可能对 os 如何分叉进程等有一些限制。我根本不知道 ose。
OS 使用:Solaris(不确定是否重要,但可能) Django v1.4、Apache 2.2、Python 2.7
在我的观点之一中概述我正在做的事情:
def run_step(request, action): if (action == "action1"): p = subprocess.Popen("command1", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) elif (action == "action2"): password = mylib.getpasswd() ## Method 1: with pexpect command = pexpect.spawn('su root -c \' command2 \'') command.expect('[pP]assword*') command.sendline(password) ## Method 2: with subprocess and a simple command #command = subprocess.Popen('ls > log.file', shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) ## Method 3: with subprocess stdin PIPE #command = subprocess.Popen('command2', shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT,stdin=subprocess.PIPE) #command.stdin.write(password) #command.communicate() ## I tried with shell = False, ## with stdin.flush() and communicate(password) too.
'Action1' 的命令执行得很好。但是 those 的问题需要像 'Action2' 那样的交互。 我尝试了三种不同的方法:
- 方法 1:像往常一样使用 pexpect 发送它但它失败了 - 命令根本没有执行。
- 方法 2:尝试了没有交互的子进程调用 - 有效。
- 方法 3:尝试使用标准输入管道进行子进程调用以尝试交互但再次失败。
我现在不确定该怎么做。任何帮助将不胜感激。
以下是对我有用的方法:
使用 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 模块不能在主线程上工作。仍然会很感激任何答案,但我现在将使用此解决方案。