【问题标题】:Unable to write to file programmatically on linux server无法在 Linux 服务器上以编程方式写入文件
【发布时间】:2012-05-11 11:56:03
【问题描述】:

我有一个 python CGI 脚本,它采用输入 xy(整数)的形式,并使用 subprocess 将其传递给 C++ 可执行文件,其中程序将两个值的总和写入文本文件。

代码在我的本地机器上运行良好。然而,经过多次测试,我发现每当我在我的服务器(/var/www)上运行这个程序并尝试写入文件时,都会出现某种错误,因为我得到了“内部服务器错误”页面。

服务器不是我的,所以我实际上没有 sudo 权限。但是通过putty,我可以手动运行可执行文件,它确实会写入文件。

我的猜测是我必须以某种方式从 python 脚本运行可执行文件并获得一定的权限,但我不确定。如有任何建议,我将不胜感激!

编辑:
@gnibbler:有趣的是,我能够毫无问题地将文件写入 /tmp 目录。

所以我认为你的建议是正确的,从浏览器调用脚本时服务器根本不允许我写。

另外,我无法访问带有错误日志的目录,所以我将尝试获得许可。

【问题讨论】:

  • 脚本是否通过网络服务器“启动”?因为如果是的话,WS 就是服务器上的用户(或者我是这么认为的)
  • 网络服务器是否正确配置为启动 cgi 脚本?你测试过 cgi 是否有效吗?
  • 脚本不以您的权限运行,它以 Web 服务器的权限运行。如果服务器没有写访问权限,脚本将因错误而死,就像你描述的那样。
  • 是的,服务器配置为 cgi 脚本。 @tripleee,恐怕你是对的。我只是希望我可以允许写入。

标签: python linux cgi subprocess


【解决方案1】:

环境不同(可能它试图写入错误的目录)或更可能的是,cgi 没有以您登录的同一用户身份运行。

例如,cgi 脚本以“nobody”或“www”等形式执行是相当普遍的。

您可以尝试让 cgi 将文件写入/tmp。这至少应该确认 cgi 正在运行的用户

【讨论】:

  • 是的,我可以写入 /tmp。我尝试让它显式写入cgi-bin(“/var/www/cgi-bin/test.out”)以及相对路径(“test.out”);两者都给出了内部服务器错误页面。
  • @Aaron,但谁拥有您在/tmp 创建的文件,并且该用户是否有权写入/var/www/cgi-bin/。顺便说一句:您真的将文件写入 cgi-bin 目录吗?这似乎很不安全
  • 实际上,我无法删除我在 /tmp 中创建的文件(哎呀)。无论如何,它是一种概念验证程序。我想将文件的链接发送给用户。也许让一个不同的目录公开可见并写入那里会更安全?
【解决方案2】:

正如其他人所说,您可能遇到了权限问题。但是,除非您查看错误日志,否则您无法确定发生了什么——内部服务器错误通常会掩盖实际错误。

要弄清楚实际错误是什么,您可以做以下两件事之一。你说你在做 CGI,所以我建议你在测试时查看cgitb;它会在您的浏览器中向您显示 Python 回溯(尽管这可能对您的子流程场景没有帮助。)

否则,您将需要查看 Web 服务器的错误日志,其中可能包含 Python 回溯,并希望向您展示发生了什么。保存这些文件的典型位置是/var/log/httpd。如果您无权访问或在此处找不到日志,请询问您的服务器管理员在哪里可以找到它们。

【讨论】:

    【解决方案3】:

    试试chmod 0666 filethatyouarewritingto.txt 如果这不起作用,请确保您的 c++ 文件在“其他”组中具有可执行权限,请尝试 chmod 0755 yourprogram

    Source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 2014-09-05
      • 2019-07-15
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多