我已经在 StackOverflow 上问过这个问题,但是考虑到在那里评论它似乎更适合这里。
这几乎肯定是系统配置问题(您没有正确设置 jail),而不是 Python 问题。您可以非常轻松地测试这一点,只需查看在 jail 内部运行 head -c16 /dev/urandom 或 dd if=/dev/urandom bs=16 count=1 时会发生什么。如果您遇到同样的错误,请前往 SuperUser 或 ServerFault 或其他通用 Unix 或 OpenBSD 论坛提问。– abarnert
以下是我所做的:
我想在我的 OpenBSD 服务器上运行一些 cgi 脚本(用 Python 编写)。由于 OpenBSD 上的 Web 服务器在 jail 中运行,因此我重新创建了整个文件夹结构(/bin /dev /usr /usr/local/lib 等等),但当我尝试导入一些需要访问 /dev/urandom 设备的 Python 模块时,仍然收到“500 服务器内部错误”错误。
我已经使用 mknod 创建了设备特殊文件。
ls -la /dev/*random
ls -la /dev/{null,zero}
我得到了以下输出
crw-r--r-- 1 root wheel 45, 3 Sep 13 11:09 /dev/arandom
crw-r--r-- 1 root wheel 45, 0 Jul 15 19:02 /dev/random
crw-r--r-- 1 root wheel 45, 1 Jul 15 19:02 /dev/srandom
crw-r--r-- 1 root wheel 45, 2 Jul 15 19:02 /dev/urandom
和
crw-rw-rw- 1 root wheel 2, 2 Sep 16 01:30 /dev/null
crw-rw-rw- 1 root wheel 2, 12 Jul 15 19:02 /dev/zero
因此我在 /var/www/dev 文件夹中执行了以下命令(OpenBSD web 服务器在 chroot -u www /var/www 中运行)
mknod -m 666 null c 2 2
mknod -m 666 zero c 2 12
mknod -m 644 random 45 0
mknod -m 644 srandom 45 1
mknod -m 644 urandom 45 2
mknod -m 644 arandom 45 3
然而,Python 仍然报告
OSError: [Errno 6] Device not configured '/dev/urandom'
相同的代码在非 chroot 环境中运行良好。
import os
import cgitb
cgitb.enable()
根据 StackOverflow 上的建议,我运行
chroot -u www /var/www dd if=/dev/urandom bs=16 count=1
并得到了相同的结果
dd: /dev/urandom: Device not configured
也就是说,这肯定是配置错误。有人能告诉我我可能犯了什么错误吗?任何帮助都将不胜感激!
答案1
我找到罪魁祸首了。
按照评论部分的建议本网站nodev
只需 mknod(如我之前所做的)并从/etc/fstab
系统安装的位置删除 即可/var
。这将删除 中的“无设备”允许标志/var
。
为了使我的脚本运行,我最终必须复制 Pythoncgitb
模块(事实上_hashlib.so
)所依赖的所有共享对象——即libcrypto.so
。
要查找您所_hashlib.so
依赖的内容,请运行ldd _hashlib.so
- 我的位于/usr/local/lib/python2.7/lib-dynload/_hashlib.so
。注意 - 如果您的系统上安装了 OpenSSL,您将找到此库。如果没有,_hashlib.so
请加载例如_md5.so
等,只有在您
- 没有 OpenSSL
- 使用标志配置和构建 Python
--with-pydebug
(检查这个答案更多细节)
希望这可以帮助!
答案2
检查/etc/fstab
。我nodev
在挂载点处有,这阻止了我的 chroot 命令正常运行。
答案3
我在 FreeBSD 和 OpenBSD 中运行 Django 时遇到了类似的问题。我的问题是 gunicorn 进程以 root 身份运行,而脚本位于其他用户的 home/dir 中。
tl;dr -> 检查进程是否以正确的用户身份运行