脚本中的chown
更新:问题比我最开始想的要复杂。我同时在尝试解决为什么我的 mkdir
不工作,发现是因为我手动更改了父目录的权限来测试,然后又把权限改回来了,并且在脚本中加了一个 chmod
,但这个命令不管用,因为它是由 apache
运行的,而不是我自己。我会发一个新问题,讨论更大的问题,因为把这些都放在一个问题里会让人困惑。
我在大学当实验室讲师,正在重写他们提供的上传作业的脚本,因为那个脚本太旧了,还经常出错。我没有修改现有的脚本(是用python写的),而是从头开始用php写一个新的。
我遇到了一个问题,似乎 chown
命令不工作。php脚本是以 apache
用户身份运行的。我不确定这个用户是否有“特权”,但原来的脚本是使用 chown
的。
我可以假设 apache
应该有必要的权限,所以我的问题出在别的地方,还是这个逻辑有问题呢?
服务器是大学的,他们绝对不会让我做任何配置更改。我相信他们使用的是CentOS系统。没有错误信息,我只是注意到我可以用 chmod
来更改文件的权限,但下一行的 chown
命令似乎没有效果。
对旧脚本执行 ls -al
显示:
-rwxr-xr-x 1 mattw labstaff 5067 Sep 1 17:52 File_Upload.cgi
看起来没有设置setuid位。
Stefan提到“apache用户很可能没有足够的权限去更改它不拥有的文件/文件夹的所有者”。我尝试 chown
的目录刚用 mkdir
创建,所以它应该是apache拥有的。既然你已经拥有文件,chown
是否应该在权限不足的情况下也能工作呢?
3 个回答
用户apache可能没有足够的权限去更改它不拥有的文件或文件夹的所有者。虽然你可以给apache更多的权限,但这样做可能会带来安全隐患。
如果旧的脚本是由 apache 用户运行的,但它能执行 chown
命令,那可能是因为它有一个叫做 setuid 的特殊标记,这样就可以用更高的权限来运行。在这种情况下,你的想法可能是错的。
请运行 ls -al /path/to/script
来确认一下。这个命令的输出应该显示 root
是它的拥有者,并且在权限设置中会有一个 s
。
如果你想给新的脚本启用 setuid 模式,可以使用 chmod u+s
命令。不过要注意,这可能会带来严重的安全问题。特别是,绝对不要让一个 setuid 的脚本或程序是可写的。
Apache可能没有足够的权限去做你想要的事情。这主要取决于它运行的环境。你提到Apache是以apache用户身份运行的,所以我猜它是在RHEL或者类似的系统,比如CentOS上。
你可以编辑sudoers文件(用visudo命令),给apache用户在某个特定目录下使用sudo的权限,而且不需要输入密码。不过,如果你对安全性很敏感,这种做法是不太推荐的。
你可以添加类似这样的内容:
apache ALL = NOPASSWD: /bin/chown 1[1-9][0-9][0-9]\:1[1-9][0-9][0-9] /var/www/[a-zA-Z0-9]*
你也可以考虑把apache用户加入到其他组,或者把其他用户加入到apache组,然后调整文件权限到0775或0664之类的。
最好能把出现错误的代码、错误信息(如果有的话),以及需要访问上传文件的用户和组的信息发出来,这样大家能更好地帮你解决问题。