【问题标题】:Python and Shell commands issuePython 和 Shell 命令问题
【发布时间】:2014-02-04 19:16:45
【问题描述】:

目前我正在开发一个小项目,我想在其中使用 Apache 和 Python 从本地网络服务器执行一些 shell 命令。

我想执行这个命令(显示连接到服务器的设备的 ip)并将其输出分配给 Python 中的变量:

grep -o '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log

当我在终端中输入这个时,它会正确显示 Ip。但我想在一个看起来像这样的python脚本中执行这个命令:

import os

print "Content-type:text/html\r\n\r\n"
print '<html>'
print '<head>'
print '<title>Connected devices</title>'
print '</head>'
print '<body>'
print '<h2>Conected Devices</h2>'
f = os.popen("grep -o '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log")
now = f.read()
print now

print '</body>'
print '</html>'

当我从我的服务器调用 python 脚本时,我只能看到标题(连接的设备)。你知道哪个可能是我的问题吗?

提前致谢

【问题讨论】:

  • 你能显示你的 access.log 文件吗?

标签: python apache shell


【解决方案1】:

首先,检查脚本在哪个目录中运行。


import os
os.getcwd()
如果它在正确的目录上运行,请尝试以下操作: from subprocess import Popen, PIPE, STDOUT cmd = "grep -o '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log" p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) output = p.stdout.read() print output

【讨论】:

  • 如果我使用你的代码,它会说“不是这样的文件或目录”。我尝试添加整个路径,然后它说“权限被拒绝”。然后我尝试添加 sudo,它显示“sudo:不存在 tty 且未指定 askpass 程序”
  • 好的,所以路径和权限似乎是问题所在。您如何以及在哪里执行脚本?是在存在 access.log 的同一用户下还是在某个不同的用户下?
  • python脚本在/usr/lib/cgi-bin目录下。它是从 .cgi 文件中调用的。这部分工作正常,因为我可以在网络服务器中看到 python 脚本的标头。我将脚本添加到与 Apache 相同的组 www-data 中。也许如果我将文件复制到 /usr/lib/cgi-bin 目录然后尝试 grep 可能是一个解决方案?
  • 2 个结帐选项。 1) 从 /usr/lib/cgi-bin 目录尝试你的 grep 命令(带有 access.log 文件的完整路径)。 ## 2) 将 python 脚本中的 PWD 更改为 access.log 所在的路径。
  • 另外,如前所述,尝试从 python 脚本打印 getcwd() 并尝试从那里运行 grep 命令,任何权限问题都可以通过这种方式验证
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2011-09-11
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多