无法使用 XAMPP 从 Python cgi 脚本写入 PYTHON_EGG_CACHE

Posted

技术标签:

【中文标题】无法使用 XAMPP 从 Python cgi 脚本写入 PYTHON_EGG_CACHE【英文标题】:Can't write to PYTHON_EGG_CACHE from Python cgi script using XAMPP 【发布时间】:2016-01-28 14:58:01 【问题描述】:

我有这个简单的脚本可以通过 ssh 连接到服务器,如果我从 shell 运行脚本,它就可以工作,但是当我从 cgi-bin (http://localhost/cgi-bin/test.py) 调用脚本时它就不行了

#!C:\Python27\python

print "Content-type: text/html\n\n"

import spur
shell = spur.SshShell(hostname="192.168.1.5", username="user", password="pass", missing_host_key=spur.ssh.MissingHostKey.accept)
result = shell.run(["pwd"])
print result.output

我在 Windows 上使用 XAMPP,我编辑了 httpd.conf 以接受来自 cgi-bin 的 .py 文件,实际上很简单

#!C:\Python27\python

print "Content-type: text/html\n\n"
print "Test"

在浏览器中工作。


在我的 Apache 日志中发现的错误如下:

Traceback (most recent call last):
  File "C:/xampp/cgi-bin/smart.py", line 4, in <module>
    import spur
  File "C:\\Python27\\lib\\site-packages\\spur\\__init__.py", line 2, in <module>
    from spur.ssh import SshShell
  File "C:\\Python27\\lib\\site-packages\\spur\\ssh.py", line 15, in <module>
    import paramiko
  File "build\\bdist.win32\\egg\\paramiko\\__init__.py", line 30, in <module>
  File "build\\bdist.win32\\egg\\paramiko\\transport.py", line 49, in <module>
  File "build\\bdist.win32\\egg\\paramiko\\dsskey.py", line 26, in <module>
  File "build\\bdist.win32\\egg\\Crypto\\PublicKey\\DSA.py", line 89, in <module>
  File "build\\bdist.win32\\egg\\Crypto\\Random\\__init__.py", line 28, in <module>
  File "build\\bdist.win32\\egg\\Crypto\\Random\\OSRNG\\__init__.py", line 34, in <module>
  File "build\\bdist.win32\\egg\\Crypto\\Random\\OSRNG\\nt.py", line 28, in <module>
  File "build\\bdist.win32\\egg\\Crypto\\Random\\OSRNG\\winrandom.py", line 7, in <module>
  File "build\\bdist.win32\\egg\\Crypto\\Random\\OSRNG\\winrandom.py", line 4, in __bootstrap__
  File "C:\\Python27\\lib\\site-packages\\pkg_resources\\__init__.py", line 1155, in resource_filename
    self, resource_name
  File "C:\\Python27\\lib\\site-packages\\pkg_resources\\__init__.py", line 1851, in get_resource_filename
    self._extract_resource(manager, self._eager_to_zip(name))
  File "C:\\Python27\\lib\\site-packages\\pkg_resources\\__init__.py", line 1881, in _extract_resource
    self.egg_name, self._parts(zip_path)
  File "C:\\Python27\\lib\\site-packages\\pkg_resources\\__init__.py", line 1221, in get_cache_path
    self.extraction_error()
  File "C:\\Python27\\lib\\site-packages\\pkg_resources\\__init__.py", line 1201, in extraction_error
    raise err
pkg_resources.ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

  [Error 5] Accesso negato: 'C:\\\\Windows\\\\Application Data'

The Python egg cache directory is currently set to:

  C:\\Windows\\Application Data\\Python-Eggs

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

提前致谢

【问题讨论】:

“不工作”是一个完全没用的问题描述;您需要从 Web 服务器的日志中获取错误消息并将其放入问题中,以允许 start 进行良好的诊断。 好的,关于如何记录错误的任何线索? 完全取决于您的网络服务器。在 Apache 中,我希望它们已经在 error_log 中(假设一个合理的默认配置)。 这里是日志pastebin.com/FVVtBiK5,我在脚本中使用 os.environ['PYTHON_EGG_CACHE'] = 'C:\tmp' 将 PYTHON_EGG_CACHE 设置为具有写入权限的 C:\tmp 但没有任何改变,我还创建了具有写权限的目录 C:\Windows\Application Data\Python-Eggs 但我仍然收到此错误 我假设您使用 adblock 并且不知道这一点,但是 pastebin.com 链接充满了广告。请使用不同的(如gist.github.com),如果您不能将内容缩减到足以编辑到您的问题中。 【参考方案1】:

一个开始的地方是将 paramiko(和其他依赖项,如果此错误再次发生)直接安装到您现有的 Python 安装中,这样就不需要将它作为鸡蛋下载和提取(因此不需要文件适合该任务的权限)。例如:

c:\Python\Scripts\easy_install.exe --always-unzip paramiko

允许您的网络服务器写入存储代码的位置(Python 鸡蛋就是代码!)是非常糟糕的安全做法(在妥协时,攻击者可以将他们自己的内容放在那里,并且在 paramiko 或其他库已加载)。

【讨论】:

以上是关于无法使用 XAMPP 从 Python cgi 脚本写入 PYTHON_EGG_CACHE的主要内容,如果未能解决你的问题,请参考以下文章

无法从 xampp 命令行运行 python 程序

无法在虚拟主机 apache 上执行 proxy.cgi

在 XAMPP (WINDOWS 8.1) 中作为脚本在 PHP 中运行 Python

如何在ubuntu中使用xampp运行python脚本

在 Xampp 中使用 cgi 脚本部署 Flask 应用程序

使用 Perl CGI 和 XAMPP 连接到 MySQL 数据库