php 没有访问权限,permissions – 通过来自通常没有权限的用户的符号链接访问PHP中的文件...

我有这个网站,如果用户提交表单,python脚本通过php页面执行,python脚本创建一个zip文件,并应提供给用户通过链接下载.该文件可能很大(几GB).

当我在大学服务器上工作时,我严格遵守他们的服务器规则和功能.这是问题所在:

该网站存储在/ data / mywebsite中,该磁盘空间有限.当然这是由www-data拥有的,因为它主要由我的Apache服务器访问.

我在/ experimentdata /中提供了1 TB的存储空间,只有一个特定的用户才能访问,比如用户.这是因为此文件夹是一个samba安装程序,可以由单个特定用户标识访问.

要在/ experimentdata中创建文件,我使用sudo -u theuser命令,该命令将以用户的身份创建文件/experimentdata/downloadme.zip.现在我的问题是:如何通过链接提供此文件以通过Apache下载?

我想过使用我输入的符号链接,例如/data/mywebsite/download/downloadme.zip.问题是用户www-data完全没有读取文件的权限!

如何让用户通过用户使用用户www-data下载文件/experimentdata/downloadme.zip?

我想明确说明涉及sudo -u theuser是绝对没问题的.但我不知道如何在我的网站文件夹之外的某个地方建立链接.

PS:如果您需要任何其他信息,请询问.

解决方法:

我认为要做的是让你的php / python直接返回数据而不是apache.你的代码可以做与apache相同的事情.根据我的经验,这比打开另一个目录和/或使用sudo,或更改apache的文件权限等要好得多.

如果程序生成的大文件比Internet连接快,那么您可以直接从程序中流式传输数据,从而消除额外的数据文件和管理它的代码以及记住它的机制.

对于将以这种方式调用的程序,消除所有stderr流输出并确保python进程的返回代码准确反映进程的成功或失败.

下面的示例显示了您将在stackoverflow的上述示例场景中使用的popen()调用.我已经预先安装了exec 2> / dev / null;到shell命令.这确保了即使从shell本身也没有输出转到标准错误,因为stderr和stdout上的数据都可能是popen()的死锁源.

如果要将磁盘文件下载到用户:

$fp = popen('exec 2>/dev/null; sudo -u theuser cat yourfile.zip', 'r');

如果要从活动进程下载数据:

$fp = popen('exec 2>/dev/null; sudo yourpythonscript arg argN', 'r');

这些命令行是shell命令,需要针对shell元字符进行适当引用.

在第二种方法中,服务器将立即开始发送数据.当用户成功提交表单后,他们会立即从浏览器中看到“另存为”对话框.一旦用户选择输出文件,您的php脚本就会直接通过线路将数据传输到远程文件中.

python脚本应该只在标准输出上打印zip数据,并返回一个准确表示zip进程成功或失败的退出代码.在python中,脚本应该在sys.stdout上写输出,例如zf = ZipFile(sys.stdout,….

调用pclose()并检查返回值至关重要,因为这将是您知道zip是否成功的唯一方法.如果pclose()返回0以外的任何内容,则会出错.

客户端如何处理文件取决于这些响应头和其他的设置:content-type:,content-encoding:和content-disposition:请参阅:http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html,查看response-header和entity-header信息.

标签:php,permissions,symlink,users,apache-httpd

来源: https://codeday.me/bug/20190813/1648763.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值