无法使用 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 (WINDOWS 8.1) 中作为脚本在 PHP 中运行 Python