只有文件所有者才能更改权限,这是正确的吗?也就是说,如果我通过cron作业创建一个文件并设置权限,那么当我从浏览器运行脚本时,我不能更改这些权限,对吗?
请问是否有任何方法解决这个问题?删除(unlink)并重新创建文件,使其成为脚本正在运行的任何用户?或者通过浏览器作为username / 通过cron作业作为nobody运行php脚本的方法?
目标是通过更改文件权限来使图片公开可见或不可见。
解决方案1: 为用户和 cron 用户创建一个组,将每个用户添加到您的新组中,并使两个用户都可以读写该文件 (chmod g+rw filename)。(比下一个解决方案更安全)。
解决方案2: 最简单的方法是让所有人都可以读写文件 (chmod a+rw filename) 将产生这种效果。
但我不建议在生产环境中使用这种方式。
您可以在脚本中不输入用户名或密码来完成此操作。
在您的crontab中,让sudo以您的Web服务器运行的用户身份执行脚本。按照您的示例,我将使用nobody用户。
0 12 * * * (sudo -u nobody php ./yourscript.php)
请注意,“nobody”用户(以及像“apache”这样的用户)通常没有登录特权。这可能需要您允许sudo在没有tty的情况下执行脚本。如果您收到类似于“sudo:sorry,you must have a tty to run sudo”的错误,则会知道这一点。
通过使用visudo命令注释掉“Defaults requiretty”行即可实现此目的。与对sudo的任何更改一样,您可能需要搜索此更改可能带来的任何副作用。
是的,只有文件的所有者才能这样做。您的选项取决于您对服务器的控制程度。
如果您对服务器有足够的控制权,可以使用SuPHP而不是Apache的mod_php。这样,PHP脚本将作为拥有脚本的用户运行,并且由PHP脚本创建的任何文件都将由同一用户拥有。
如果您没有那么多的控制权(例如常见的共享Web托管),则可以使用类似Joomla FTP方法的东西。当在Joomla中启用FTP支持时,它会使用FTP进行所有文件操作。这样,它可以创建或操作具有与FTP用户相同权限的文件。
类似于以下内容(省略错误处理):
$ftp = ftp_connect('localhost');
ftp_login($ftp, 'username', 'password');
ftp_chdir($ftp, '/root/to/website');
ftp_chmod($ftp, 0644, 'filename.ext');
ftp_close($ftp);
只有该文件的所有者才能执行此操作,建议将cronjob作为“无人”运行。