【问题标题】:PHP-invoked python script cannot writePHP调用的python脚本不能写
【发布时间】:2017-12-04 18:21:04
【问题描述】:

我设置了一个小型网络应用程序,可将用户数据传递给 python 脚本。 Python 应该开始工作,在网络服务器上创建一个文件,并允许用户下载它。但是,脚本执行似乎在 Python write() 命令发出的地方停止。

Python:

print("Writing to '" + filename + "'")
f = open('backups/' + filename, 'w')
f.write(self.output())
f.close()
print("Done!")

PHP:

$user = escapeshellarg($_POST['user']);
$password = escapeshellarg($_POST['password']);
$command = './backup.py '.$user.' '.$password;
print(exec($command));

实际结果:

  1. Python 确实在所需目录中创建了一个文件,但它仍然为空。 2. Python 从不输出“完成!” (因为权限被拒绝)

预期结果:

  1. Python 使用数据创建文件
  2. Python 继续打印“完成!”输出到调用 PHP 脚本

我做了以下事情:

  1. www-data 对目录./backup 具有组写入权限 (drwxrwsr-x)
  2. #!/usr/bin/env python3 shebang 存在于 python 文件中
  3. python 文件可执行
  4. 当我使用sudo su www-data 更改为用户www-data 然后启动php 命令行,并输入上述命令调用我的Python 脚本时,文件已正确创建!
  5. 如果我启动一个内置的 php 服务器,它也可以正常工作,只有通过 apache 处理 php 脚本,它不起作用

【问题讨论】:

  • 你可能在这里过度逃避事情。 escapeshellarg 调用应该足够了。 escapeshellcmd 可能会添加额外的转义来破坏事情。
  • 感谢您的建议,我删除了多余的转义符。但是脚本仍然无法写入文件。好像可以create文件,所以我觉得权限还可以吗?
  • 如果网站是通过 php 内置服务器 (php -S localhost:8000) 提供的,它可以正常工作,但如果它是通过 Apache 提供的,则不能
  • 应该像以前一样使用escapeshellarg。对escapeshellcmd 的第二次调用是错误的。我会用 Program Files/(Untitled 2).txt; touch ~/hacked.txt 之类的文件名进行测试
  • 哦,好的,谢谢;改变了。但最终这并不重要,请参阅下面的答案。

标签: php python shell


【解决方案1】:

我已经正式浪费了我一整天的时间。

权限没问题。 发生的情况是,python 脚本只有在通过我的 php 脚本调用并且只有 Apache 提供服务时才会失败。

查看 Apache 错误日志显示,python 脚本失败是因为它无法将字节写入文件,而 ascii 转换失败是因为输出中有 unicode 数据。

所以f = open(filename, 'wb') 解决了这个问题。

在我的开发机器上或通过内置 PHP 服务器未观察到此行为。仍然想知道为什么文件处理会有所不同。如果有人有答案,将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多