calvez
4/6/2017 - 7:31 AM

Drupal - Bash shell script to fix Drupal permissions

Drupal - Bash shell script to fix Drupal permissions

#!/bin/bash
if [ $(id -u) != 0 ]; then
	        printf "This script must be run as root.\n"
		        exit 1
		fi
		drupal_path=${1%/}
		drupal_user=${2}
		httpd_group="${3:-www-data}"
		# Help menu
		print_help() {
			cat <<-HELP
			This script is used to fix permissions of a Drupal installation
			you need to provide the following arguments:
			1) Path to your Drupal installation.
			2) Username of the user that you want to give files/directories ownership.
			3) HTTPD group name (defaults to www-data for Apache).
			Usage: (sudo) bash ${0##*/} --drupal_path=PATH --drupal_user=USER --httpd_group=GROUP
			Example: (sudo) bash ${0##*/} --drupal_path=/usr/local/apache2/htdocs --drupal_user=john --httpd_group=www-data
			HELP
			exit 0
		}
		# Parse Command Line Arguments
		while [ $# -gt 0 ]; do
			        case "$1" in
					                --drupal_path=*)
								drupal_path="${1#*=}"
								;;
							--drupal_user=*)
								drupal_user="${1#*=}"
								;;
							--httpd_group=*)
								httpd_group="${1#*=}"
								;;
							--help) print_help;;
						*)
							printf "Invalid argument, run --help for valid arguments.\n";
							exit 1
					esac
					shift
				done
				if [ -z "${drupal_path}" ] || [ ! -d "${drupal_path}/sites" ] || [ ! -f "${drupal_path}/core/modules/system/system.module" ] && [ ! -f "${drupal_path}/modules/system/system.module" ]; then
					printf "Please provide a valid Drupal path.\n"
					print_help
					exit 1
				fi
				if [ -z "${drupal_user}" ] || [ $(id -un ${drupal_user} 2> /dev/null) != "${drupal_user}" ]; then
					printf "Please provide a valid user.\n"
					print_help
					exit 1
				fi
				cd $drupal_path
				printf "Changing ownership of all contents of "${drupal_path}":\n user => "${drupal_user}" \t group => "${httpd_group}"\n"
				chown -R ${drupal_user}:${httpd_group} .
				printf "Changing permissions of all directories inside "${drupal_path}" to "rwxr-x---"...\n"
				find . -type d -exec chmod u=rwx,g=rx,o= '{}' \;
				printf "Changing permissions of all files inside "${drupal_path}" to "rw-r-----"...\n"
				find . -type f -exec chmod u=rw,g=r,o= '{}' \;
				printf "Changing permissions of "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
				cd sites
				find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
				printf "Changing permissions of all files inside all "files" directories in "${drupal_path}/sites" to "rw-rw----"...\n"
				printf "Changing permissions of all directories inside all "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
				for x in ./*/files; do
					find ${x} -type d -exec chmod ug=rwx,o= '{}' \;
					find ${x} -type f -exec chmod ug=rw,o= '{}' \;
				done
				echo "Done settings proper permissions on files and directories"
#!/bin/bash

path=${1%/}
user=${2}
group="www-data"
help="nHelp: This script is used to fix permissions of a drupal installationnyou need to provide the following arguments:nt 1) Path to your drupal installationnt 2) Username of the user that you want to give files/directories ownershipnNote: "www-data" (apache default) is assumed as the group the server is belonging to, if this is different you need to modify it manually by editing this scriptnnUsage: (sudo) bash ${0##*/} drupal_path user_namen"

if [ -z "${path}" ] || [ ! -d "${path}/sites" ] || [ ! -f "${path}/modules/system/system.module" ]; then
	echo "Please provide a valid drupal path"
	echo -e $help
	exit
fi

if [ -z "${user}" ] || [ "`id -un ${user} 2> /dev/null`" != "${user}" ]; then
	echo "Please provide a valid user"
	echo -e $help
	exit
fi

cd $path;

echo -e "Changing ownership of all contents of "${path}" :n user => "${user}" t group => "${group}"n"
chown -R ${user}:${group} .
echo "Changing permissions of all directories inside "${path}" to "750"..."
find . -type d -exec chmod u=rwx,g=rx,o= {} ;
echo -e "Changing permissions of all files inside "${path}" to "640"...n"
find . -type f -exec chmod u=rw,g=r,o= {} ;

cd $path/sites;

echo "Changing permissions of "files" directories in "${path}/sites" to "770"..."
find . -type d -name files -exec chmod ug=rwx,o= '{}' ;
echo "Changing permissions of all files inside all "files" directories in "${path}/sites" to "660"..."
find . -name files -type d -exec find '{}' -type f ; | while read FILE; do chmod ug=rw,o= "$FILE"; done
echo "Changing permissions of all directories inside all "files" directories in "${path}/sites" to "770"..."
find . -name files -type d -exec find '{}' -type d ; | while read DIR; do chmod ug=rwx,o= "$DIR"; done