使所有PHP文件(递归地)可执行

7

我刚在服务器上下载了MediaWiki软件用于安装。解压后,我发现PHP文件不可执行。

我运行了 chmod +x *.php* (还有.php5文件),但在子目录中无法工作。

如何递归地将可执行标志添加到MediaWiki文件夹内所有PHP脚本中并扫描子文件夹?

提前感谢您的帮助。


2
我认为你不需要将所有文件都设为可执行文件。普通的PHP包含脚本不需要该标志。这仅建议用于命令行脚本。因此,在适当的工具文件夹中只需使用几个 chmod +x */*.phpchmod +x */*/*.php 即可。 - mario
@mario,如果我没记错的话,这是一种可能的(尽管可能不常见)服务器设置,利用了“X位操作技巧”。 - Álvaro González
你应该始终限定你的chmod命令。chmod a+x *.php*将为用户、组和全局设置执行位。这是你无论如何都会隐式执行的操作,但更加清晰明了。根据你的情况,你可能只需要为用户和组设置可执行权限(chmod ug+x),如果这样可以工作,那么你应该采用这种方式。 - sorpigal
出于安全考虑,我建议避免使用 ao(或通过省略限定符来暗示 a)。最好使用 ug+x,o-x - Dennis Williamson
抱歉,Dennis,但由于Apache以wwwrun身份运行,因此必须要求脚本可由其他人执行。 - usr-local-ΕΨΗΕΛΩΝ
2个回答

16

在MediaWiki目录中使用bash

find . -iname "*.php" | xargs chmod +x

8
为确保该命令适用于包含空格的文件名,请使用以下命令:find . -iname '*.php' -print0 | xargs -0 chmod +x该命令的作用是将当前目录及其子目录中扩展名为.php的所有文件设置为可执行。使用-print0参数和xargs命令的-0选项可以处理文件名中包含空格的情况。 - Robert Ros
没错。使用空格命名文件是不好的 ;) 我希望MediaWiki是一个好的软件。 - shfx
实际上,罗伯特的评论并不适用于MediaWiki,但对于一般用途而言是一个值得记住的好习惯。 - usr-local-ΕΨΗΕΛΩΝ

2

在子目录中它不起作用,因为*.php*不匹配任何目录,因此不会包含它。

因此,您应该使用类似于find ./ -iname "*.php*" -exec chmod 755 {} \;的东西来设置相应的位。


由于chmod可以一次操作多个文件,并且在并行执行时这个操作不会失败,所以你应该使用+而不是\;来关闭你的-exec - sorpigal
“*.php*” 被认为匹配 .php 和 .php5,而不是子目录 ;) - usr-local-ΕΨΗΕΛΩΝ
当您不知道结果列表中的项目数量时,请勿使用 +。这将在脚本中引入Bohrbug。如果列表足够大,则会超过可执行命令行的最大长度(好吧,我知道它比2 M字节更大,但仍然不安全)。 - karatedog
@djechelon:当然,它被设计成匹配“.php”和“.php5”,但你的问题是它不能用于子目录。尽管子目录名为“subdir”(包括几个以“.php”或“.php5”结尾的文件),但不会被考虑在内,因为“subdir”不匹配“*.php”。因此,在“subdir”中,“.php*”文件的可执行位未设置... ;) - philonous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接