cPanel服务器用户文件权限修复脚本第32行语法错误排查求助
修复cPanel用户文件权限脚本的语法错误问题
嘿,我来帮你搞定这个脚本的语法错误!你的问题出在第32行的find命令上,主要是两个Shell语法细节没处理好:
- 括号的转义问题:
(和)是Shell的特殊字符,用来做命令分组,在find里用来组合条件时,必须用反斜杠\转义,不然Shell会误以为你要执行命令分组,直接报错。 - 分号的转义问题:
find的-exec选项结尾的分号;也得转义成\;,否则Shell会把它当成当前命令的结束标记,而不是传给find命令处理。
错误的原代码行:
find $HOMEDIR -type f ( -name "*.pl" -o -name "*.perl" ) -exec chmod 755 {} ; -print
修复后的正确代码行:
find $HOMEDIR -type f \( -name "*.pl" -o -name "*.perl" \) -exec chmod 755 {} \; -print
另外我还发现脚本里其他几个find命令也犯了同样的分号没转义的问题,这些地方也得一起修复,不然运行时同样会出问题。还有个小细节:脚本里echo "Setting permissions for user $USER"这里应该用循环变量$user而不是$USER,不然一次性处理多个用户时,这里会显示所有传入的用户,而不是当前正在处理的那个,日志会不准确。
完整修复后的脚本:
#!/bin/bash # Script to fix permissions of accounts if [ "$#" -lt "1" ];then echo "Must specify user" exit; fi USER=$@ for user in $USER do HOMEDIR=$(egrep "^${user}:" /etc/passwd | cut -d: -f6) if [ ! -f /var/cpanel/users/$user ]; then echo "$user user file missing, likely an invalid user" elif [ "$HOMEDIR" == "" ];then echo "Couldn't determine home directory for $user" else echo "Setting ownership for user $user" chown -R $user:$user $HOMEDIR chmod 711 $HOMEDIR chown $user:nobody $HOMEDIR/public_html $HOMEDIR/.htpasswds chown $user:mail $HOMEDIR/etc $HOMEDIR/etc/*/shadow $HOMEDIR/etc/*/passwd echo "Setting permissions for user $user" find $HOMEDIR -type f -exec chmod 644 {} \; -print find $HOMEDIR -type d -exec chmod 755 {} \; -print find $HOMEDIR -type d -name cgi-bin -exec chmod 755 {} \; -print find $HOMEDIR -type f \( -name "*.pl" -o -name "*.perl" \) -exec chmod 755 {} \; -print fi done chmod 750 $HOMEDIR/public_html if [ -d "$HOMEDIR/.cagefs" ]; then chmod 775 $HOMEDIR/.cagefs chmod 700 $HOMEDIR/.cagefs/tmp chmod 700 $HOMEDIR/.cagefs/var chmod 777 $HOMEDIR/.cagefs/cache chmod 777 $HOMEDIR/.cagefs/run fi
小提示:
写Shell脚本时,涉及到find、grep这类带有特殊字符参数的命令,一定要记得转义特殊字符,避免Shell提前解析它们。另外循环里用对变量名,能让日志和操作更准确哦。
内容的提问来源于stack exchange,提问作者Wade John Beckett
相关产品推荐
相关产品推荐

