????
| Current Path : /home/ |
| Current File : //home/fixperms.sh |
#!/bin/bash
# Script to fix permissions of accounts
# Original written by: Vanessa Vasile 5/13/10
# http://thecpaneladmin.com
# Added features by: awalilko@liquidweb.com
version=4.1
#ensure we are using bash
[ "$(ps h -p "$$" -o comm)" != "bash" ] && exec bash $0 $*
#set default mode
mode=pubhtml
#set acl storage folder
aclfolder=/tmp/fixperms/
helptext() {
echo "fixperms version $version
Correct user account permissions to align to control panel standards.
Automatically detects proper server type and adjusts fixes performed.
Back up ACLs before running repairs to $aclfolder.
USAGE
When operating on a cPanel server, usernames are accepted.
cPanel usage:
bash fixperms.sh [-d|-f|-m] [-a|username [username...]]
When on a Plesk Linux server, domain names are accepted.
Plesk usage:
bash fixperms.sh [-d|-f|-m] [-a|domain [domain...]]
On a MWPv2 server, usernames in the format s[0-9]+ are accepted.
MWPv2 usage:
bash fixperms.sh [-a|username [username...]]
-h display help text
-a all users
-d docroot mode, affect just site docroots (default)
-m mail mode, only affect mail-related files
-f full mode, affect entire user homedir
-u filename.gz 'undo' mode, feed a filepath to restore ACLs
no username required for undo mode.
"
}
if [ "$#" -lt "1" ]; then #no arguments passed
helptext
exit
fi
while getopts :fdmahu: opt; do #parse cli arguments
case $opt in
h) helptext && exit;;
a) allusers=1;;
f) mode=full;;
d) mode=pubhtml;;
m) mode=mail;;
u) undo=1; file=$OPTARG;;
\?) echo "Invalid option: -$OPTARG" && helptext && exit;;
:) echo "Option -$OPTARG requires an argument!" && exit;;
esac
done
cpaneluserlist() { #compile a userlist for cpanel servers
if [ $allusers ]; then
echo "Adding all users to userlist..."
userlist=$(\ls -A /var/cpanel/users/ | egrep -v "\b(root|bin|nobody|cpanel|halt|system)\b")
else
shift $((OPTIND - 1))
userlist=$(echo $@)
fi
if [ "$userlist" = "" ] || [[ $(echo $userlist | egrep "\b(root|bin|nobody|cpanel|halt|system)\b") ]]; then
echo "Invalid user or no user specified."
helptext
exit
fi
}
pleskuserlist() { #compile a userlist for plesk server
if [ $allusers ]; then
echo "Adding all users to userlist..."
userlist=$(plesk bin subscription -l)
else
shift $((OPTIND - 1))
userlist=$(echo $@)
fi
if [ "$userlist" = "" ]; then
echo "Invalid user or no user specified."
helptext
exit
fi
}
mwpv2userlist() { #compile a userlist for MWPv2 servers
if [ $allusers ]; then
echo "Adding all users to userlist..."
userlist=$(egrep ^s[0-9]+ /etc/passwd | awk -F: '{print $1}')
else
shift $((OPTIND - 1))
userlist=$(echo $@)
fi
if [ "$userlist" = "" ]; then
echo "Invalid user or no user specified."
helptext
exit
fi
}
cpanelexecute() { #cpanel fix execution
for user in $userlist; 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 "Processing $user..."
if [ "$mode" = "full" ]; then
echo "Running full mode..."
backupacl
chown -hR $user:$user $HOMEDIR
chgrp -h nobody $HOMEDIR/public_html $HOMEDIR/.htpasswds
cpaneldocroot
cpanelmail
find $HOMEDIR -type f ! -path "*/mail/*" ! -path "*/.ssh/*" ! -perm 000 -exec chmod 644 {} \;
find $HOMEDIR -type d ! -path "*/mail/*" ! -path "*/.ssh/*" ! -perm 000 -exec chmod 755 {} \;
find $HOMEDIR -type d ! -path "*/mail/*" ! -path "*/.ssh/*" -name cgi-bin -exec chmod 755 {} \;
find $HOMEDIR -type f \( -name "*.pl" -o -name "*.perl" -o -name "*.cgi" \) ! -perm 000 ! -path "*/mail/*" ! -path "*/.ssh/*" -exec chmod 755 {} \;
chmod 750 $HOMEDIR/public_html
chmod 711 $HOMEDIR
for docroot in $(grep \ $user\=\= /etc/userdatadomains | awk -F"==" '{print $5}' | grep $HOMEDIR); do
chmod 750 $docroot
done
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
cpanelhtaccess
elif [ "$mode" = "mail" ]; then
echo "Running mail mode..."
backupacl
cpanelmail
else #pubhtml mode
echo "Running docroot mode..."
backupacl
cpaneldocroot
for docroot in $(grep \ $user\=\= /etc/userdatadomains | awk -F"==" '{print $5}' | grep $HOMEDIR); do
find $docroot -type f ! -path "*/mail/*" ! -path "*/.ssh/*" ! -perm 000 -exec chmod 644 {} \;
find $docroot -type d ! -path "*/mail/*" ! -path "*/.ssh/*" ! -perm 000 -exec chmod 755 {} \;
find $docroot -type d ! -path "*/mail/*" ! -path "*/.ssh/*" -name cgi-bin -exec chmod 755 {} \;
find $docroot -type f \( -name "*.pl" -o -name "*.perl" -o -name "*.cgi" \) ! -perm 000 -exec chmod 755 {} \;
chmod 750 $docroot
done
cpanelhtaccess
fi
echo "$user done!"
fi
done
}
cpaneldocroot() {
for docroot in $(grep \ $user\=\= /etc/userdatadomains | awk -F"==" '{print $5}' | grep $HOMEDIR); do
chown -hR $user:$user $docroot
done
for docroot in $(grep \ $user\=\= /etc/userdatadomains | awk -F"==" '{print $5}' | grep $HOMEDIR); do
chgrp -h nobody $docroot
done
}
cpanelmail() {
chown -hR $user:$user $HOMEDIR/etc $HOMEDIR/mail
chown -h $user:mail $HOMEDIR/etc $HOMEDIR/etc/*/shadow $HOMEDIR/etc/*/passwd
find $HOMEDIR/mail/ -type d -exec chmod 751 {} \;
}
cpanelhtaccess() {
for docroot in $(grep \ $user\=\= /etc/userdatadomains | awk -F"==" '{print $5}' | grep $HOMEDIR); do
find $docroot -name .htaccess -exec sed -i 's/^\s*php_/#php_/g' {} \;
done
}
pleskexecute() { #plesk fix execution
for domain in $userlist; do
echo "Processing $domain..."
user=$(plesk bin subscription -i $domain | grep FTP\ Login | awk '{print $3}')
HOMEDIR=$(egrep ^${user}: /etc/passwd | cut -d: -f6)
if [ "$HOMEDIR" == "" ]; then
echo "Couldn't determine username or homedir for $domain"
else
if [ "$mode" = "full" ]; then
echo "Full mode not ready for plesk, running docroot and mail modes..."
backupacl
for docroot in $HOMEDIR/httpdocs/; do
chown -hR $user:psacln $docroot
chgrp -h psaserv $docroot
find $docroot -type f ! -perm 000 -exec chmod 644 {} \;
find $docroot -type d ! -perm 000 -exec chmod 755 {} \;
chmod 750 $docroot
done
chown -R popuser:popuser /var/qmail/mailnames/$domain
elif [ "$mode" = "mail" ]; then
echo "Running mail mode..."
backupacl
chown -R popuser:popuser /var/qmail/mailnames/$domain
else
echo "Running docroot mode..."
backupacl
for docroot in $HOMEDIR/httpdocs/; do
chown -hR $user:psacln $docroot
chgrp -h psaserv $docroot
find $docroot -type f ! -perm 000 -exec chmod 644 {} \;
find $docroot -type d ! -perm 000 -exec chmod 755 {} \;
chmod 750 $docroot
done
fi
echo "$domain done!"
fi
done
}
mwpv2execute() { #MWPv2 fix execution
for user in $userlist; do
echo "Processing $user..."
backupacl
chown -R $user. /home/$user/html/
chown $user:www-data /home/$user/html
chown $user:www-data /home/$user/nginx
chown -R root. /home/$user/html/wp-content/mu-plugins/
chown root:$user /home/$user/html/wp-content/mu-plugins
find /home/$user/html/ -type f -exec chmod 644 '{}' \;
find /home/$user/html/ -type d -exec chmod 755 '{}' \;
chmod 1775 /home/$user/html/wp-content/mu-plugins
chmod 750 /home/$user/html /home/$user/nginx
echo "$user done!"
done
}
backupacl() { #store ACLs
mkdir -p $aclfolder
echo "Backing up ACL for $user into $aclfolder..."
case $servertype in
cp) getfacl -R --absolute-names $HOMEDIR | gzip > $aclfolder/$user.$(date +%d%b%Y.%H%M).facl.gz
;;
plesk) getfacl -R --absolute-names $HOMEDIR | gzip > $aclfolder/$domain.$(date +%d%b%Y.%H%M).facl.gz
;;
mwpv2) getfacl -R --absolute-names /home/$user | gzip > $aclfolder/$user.$(date +%d%b%Y.%H%M).facl.gz
;;
esac
}
#select undo mode (universal), cpanel, mwpv2, or plesk automatially
if [ $undo ]; then
# since you are restoring an acl file fixperms made, its assumed acl tools are already installed
pushd / &> /dev/null
[ ! -f $file ] && echo "This doesn't look like a file... Make sure you pass a full path." && exit
[[ ! "$file" =~ .*\.gz$ ]] && echo "This doesn't look like a .gz file... Be sure to not unzip it first!" && exit
echo "Undoing!"
gunzip $file
setfacl --restore ${file%.gz}
gzip ${file%.gz}
popd &> /dev/null
exit
elif [ -f /etc/wwwacct.conf ]; then
echo "cPanel server detected"
! rpm --quiet -q acl && echo "Installing acl package..." && yum -y -q install acl
servertype=cp
cpaneluserlist $*
cpanelexecute
elif [ -f /etc/psa/.psa.shadow ]; then
echo "Plesk server detected"
! rpm --quiet -q acl && echo "Installing acl package..." && yum -y -q install acl
servertype=plesk
pleskuserlist $*
pleskexecute
elif [ -f /etc/debian_version ] && docker ps | grep -q liquidweb; then
echo "MWPv2 server detected"
! dpkg -s acl &> /dev/null && echo "Installing acl package..." && apt-get -y -qq install acl
servertype=mwpv2
mwpv2userlist $*
mwpv2execute
else
echo "Can't detect server type."
helptext
fi