【发布时间】: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));
实际结果:
- Python 确实在所需目录中创建了一个文件,但它仍然为空。 2. Python 从不输出“完成!” (因为权限被拒绝)
预期结果:
- Python 使用数据创建文件
- Python 继续打印“完成!”输出到调用 PHP 脚本
我做了以下事情:
- www-data 对目录
./backup具有组写入权限 (drwxrwsr-x) -
#!/usr/bin/env python3shebang 存在于 python 文件中 - python 文件可执行
- 当我使用
sudo su www-data更改为用户www-data 然后启动php 命令行,并输入上述命令调用我的Python 脚本时,文件已正确创建! - 如果我启动一个内置的 php 服务器,它也可以正常工作,只有通过 apache 处理 php 脚本,它不起作用
【问题讨论】:
-
你可能在这里过度逃避事情。
escapeshellarg调用应该足够了。escapeshellcmd可能会添加额外的转义来破坏事情。 -
感谢您的建议,我删除了多余的转义符。但是脚本仍然无法写入文件。好像可以create文件,所以我觉得权限还可以吗?
-
如果网站是通过 php 内置服务器 (php -S localhost:8000) 提供的,它可以正常工作,但如果它是通过 Apache 提供的,则不能
-
您应该像以前一样使用
escapeshellarg。对escapeshellcmd的第二次调用是错误的。我会用Program Files/(Untitled 2).txt和; touch ~/hacked.txt之类的文件名进行测试 -
哦,好的,谢谢;改变了。但最终这并不重要,请参阅下面的答案。