| Server IP : 172.67.201.108 / Your IP : 216.73.216.11 Web Server : Apache/2.4.68 (Amazon Linux) OpenSSL/3.5.5 System : Linux ip-172-31-69-123.ec2.internal 6.1.176-223.369.amzn2023.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jul 24 13:34:27 UTC 2026 x86_64 User : ec2-user ( 1000) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /opt/lucee/sys/ |
Upload File : |
#!/bin/bash
#
# ----------------------------------------------------------------------------------
# Purpose: Changes the user that the CFML server runs as and creates custom
# control script based on that user.
# Author: Jordan Michaels ([email protected])
# Copyright: Jordan Michaels, 2010-2018, All rights reserved.
#
# Usage: change_user.sh [username] [install dir] [engine] [nobackup]
#
# [username] must start with a lower-case letter and must be alpha-
# numeric
# [engine] must be either "lucee" or "openbd". Engine name is used
# in the control script name, such as "lucee_ctl" or "openbd_ctl"
# ----------------------------------------------------------------------------------
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# ----------------------------------------------------------------------------------
if [ ! $(id -u) = "0" ]; then
echo "Error: This script needs to be run as root.";
echo "Exiting...";
exit;
fi
# test user input
if [ -z $1 ]; then # make sure it was specified
echo "Error: No User Name Specified.";
echo "";
echo "Usage: ./change_user.sh [username] /path/to/installdir [engine]";
exit 1;
elif [[ ! $1 =~ ^[a-z][a-zA-Z0-9_-]+$ ]]; then # make sure username is a valid format
echo "Error: Invalid User Name";
echo "";
echo "Rules for User Names:";
echo "1) User Names must start with a lower-case letter"
echo "2) User Names must contain only alphanumeric characters, hyphens, or underscores.";
echo "";
echo "Usage: ./change_user.sh [username] /path/to/installdir [engine]";
exit 1;
else
myUserName=$1;
fi
if [ -z $2 ]; then # make sure install dir is specified
echo "Error: No Installation Directory Specified.";
echo "";
echo "Usage: ./change_user.sh [username] /path/to/installdir [engine]";
exit 1;
elif [ ! -d $2 ]; then # make sure it's a directory
echo "Error: Directory provided does not exist or is not a directory.";
echo "";
echo "Usage: ./change_user.sh [username] /path/to/installdir [engine]";
exit 1;
elif [ ! -d "$2/tomcat/" ]; then # make sure it contains tomcat
echo "Error: Directory provided doesn't appear to be valid.";
echo "";
echo "Usage: ./change_user.sh [username] /path/to/installdir [engine]";
exit 1;
else
myInstallDir=$2;
fi
if [ -z $3 ]; then # see if an engine was specified
echo "Error: Engine name must be either 'lucee' or 'openbd'.";
echo "";
echo "Usage: ./change_user.sh [username] /path/to/installdir [engine]";
exit 1;
elif [[ "$3" = "lucee" ]]; then
myCFServerName="Lucee";
myControlScriptName="lucee_ctl";
elif [[ "$3" = "openbd" ]]; then
myCFServerName="OpenBD";
myControlScriptName="openbd_ctl";
else
# if the engine isn't lucee or openbd, throw an error
echo "Error: Engine name must be either 'lucee' or 'openbd'.";
echo "";
echo "Usage: ./change_user.sh [username] /path/to/installdir [engine]";
exit 1;
fi
if [ -z $4 ]; then # check to see if we're making a backup of the control scropt
echo "I will backup control scripts to .old";
myControlNeedsBackup=1;
elif [ "$4" = "nobackup" ]; then
echo "I will not backup control scripts.";
myControlNeedsBackup=0;
else
echo "I will backup control scripts to .old";
myControlNeedsBackup=1;
fi
###################
# begin functions #
###################
# check to see if the user exists
function checkUserExists {
echo -n "Checking to see if user exists...";
myUserNeedsCreating=0;
if [ `cat /etc/passwd | grep -c ${myUserName}:` -gt 0 ]; then
echo "[FOUND]";
else
echo "[NOT FOUND]";
myUserNeedsCreating=1;
fi
}
function checkGroupExists {
echo -n "Checking to see if group exists...";
myGroupNeedsCreating=0;
if [ `cat /etc/group | grep -c ${myUserName}:` -gt 0 ]; then
echo "[FOUND]";
else
echo "[NOT FOUND]";
myGroupNeedsCreating=1;
fi
}
# function to create the new user
function createUserAndGroup {
echo "Initializing user and group creation process...";
checkUserExists;
checkGroupExists;
if [ ${myGroupNeedsCreating} -eq 1 ]; then
echo -n "Creating Group...";
groupadd ${myUserName} -r;
echo "[DONE]";
fi
if [ ${myUserNeedsCreating} -eq 1 ]; then
echo -n "Creating User...";
useradd ${myUserName} -g ${myUserName} -d ${myInstallDir} -s /bin/false -r;
echo "[DONE]";
fi
}
function updateInstallDir {
echo -n "Applying new permissions to Installation Directory...";
chown -R ${myUserName}:${myUserName} ${myInstallDir};
echo "[DONE]";
}
function rebuildControlScript {
echo "Rebuilding Control Scripts for new User...";
# backup current control script
if [ ${myControlNeedsBackup} -eq 1 ]; then
# If we're backing up, do it
mv ${myInstallDir}/${myControlScriptName} ${myInstallDir}/${myControlScriptName}.old;
else
# otherwise, just remove the old file
rm -rf ${myInstallDir}/${myControlScriptName}
fi
# write new one...
singleQuote=$'\140'
TomcatControlScript="${myInstallDir}/${myControlScriptName}";
TEMP=`touch $TomcatControlScript`;
TEMP=`echo "#!/bin/bash" >> $TomcatControlScript`;
TEMP=`echo "# chkconfig: 345 22 78" >> $TomcatControlScript`;
TEMP=`echo "# description: Tomcat/${myCFServerName} Control Script" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "### BEGIN INIT INFO" >> $TomcatControlScript`;
TEMP=`echo "# Provides: lucee_ctl" >> $TomcatControlScript`;
TEMP=`echo "# Required-Start: \\$network " >> $TomcatControlScript`;
TEMP=`echo "# Required-Stop: \\$network " >> $TomcatControlScript`;
TEMP=`echo "# Default-Start: 2 3 4 5" >> $TomcatControlScript`;
TEMP=`echo "# Default-Stop: 0" >> $TomcatControlScript`;
TEMP=`echo "# Short-Description: Tomcat/Lucee Control Script" >> $TomcatControlScript`;
TEMP=`echo "# Description: This is the control script that starts and stops Tomcat which contains a global install of the Lucee servlet." >> $TomcatControlScript`;
TEMP=`echo "### END INIT INFO" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "# switch the subshell to the tomcat directory so that any relative" >> $TomcatControlScript`;
TEMP=`echo "# paths specified in any configs are interpreted from this directory." >> $TomcatControlScript`;
TEMP=`echo "cd ${myInstallDir}/tomcat/" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "# set base params for subshell" >> $TomcatControlScript`;
TEMP=`echo "CATALINA_BASE=${myInstallDir}/tomcat; export CATALINA_BASE" >> $TomcatControlScript`;
TEMP=`echo "CATALINA_HOME=${myInstallDir}/tomcat; export CATALINA_HOME" >> $TomcatControlScript`;
TEMP=`echo "CATALINA_PID=${myInstallDir}/tomcat/work/tomcat.pid; export CATALINA_PID" >> $TomcatControlScript`;
TEMP=`echo "CATALINA_TMPDIR=${myInstallDir}/tomcat/temp; export CATALINA_TMPDIR" >> $TomcatControlScript`;
TEMP=`echo "JRE_HOME=${myInstallDir}/jre; export JRE_HOME" >> $TomcatControlScript`;
TEMP=`echo "JAVA_HOME=${myInstallDir}/jre; export JAVA_HOME" >> $TomcatControlScript`;
TEMP=`echo "TOMCAT_OWNER=${myUserName}; export TOMCAT_OWNER" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "findpid() {" >> $TomcatControlScript`;
TEMP=`echo " PID_FOUND=0" >> $TomcatControlScript`;
TEMP=`echo " if [ -f \\"\\$CATALINA_PID\\" ] ; then" >> $TomcatControlScript`;
TEMP=`echo " PIDNUMBER=${singleQuote}cat \\"\\$CATALINA_PID\\"${singleQuote}" >> $TomcatControlScript`;
TEMP=`echo " TEST_RUNNING=${singleQuote}ps -p \\${PIDNUMBER} | grep \\${PIDNUMBER} | grep java${singleQuote}" >> $TomcatControlScript`;
TEMP=`echo " if [ ! -z \\"\\${TEST_RUNNING}\\" ]; then " >> $TomcatControlScript`;
TEMP=`echo " # PID is found and running" >> $TomcatControlScript`;
TEMP=`echo " PID_FOUND=1" >> $TomcatControlScript`;
TEMP=`echo " fi" >> $TomcatControlScript`;
TEMP=`echo " fi" >> $TomcatControlScript`;
TEMP=`echo "}" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "start() {" >> $TomcatControlScript`;
TEMP=`echo " echo -n \\" * Starting ${myCFServerName}: \\"" >> $TomcatControlScript`;
TEMP=`echo " findpid" >> $TomcatControlScript`;
TEMP=`echo " # only actually run the start command if the PID isn't found" >> $TomcatControlScript`;
TEMP=`echo " if [ \\$PID_FOUND -eq 0 ] ; then" >> $TomcatControlScript`;
TEMP=`echo " su -p -s /bin/sh \\$TOMCAT_OWNER \\$CATALINA_HOME/bin/startup.sh" >> $TomcatControlScript`;
TEMP=`echo " COUNT=0" >> $TomcatControlScript`;
TEMP=`echo " while [ \\$COUNT -lt 3 ] ; do" >> $TomcatControlScript`;
TEMP=`echo " COUNT=\\$((\\$COUNT+1))" >> $TomcatControlScript`;
TEMP=`echo " echo -n \\". \\"" >> $TomcatControlScript`;
TEMP=`echo " sleep 1" >> $TomcatControlScript`;
TEMP=`echo " done" >> $TomcatControlScript`;
TEMP=`echo " echo \\"[DONE]\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"--------------------------------------------------------\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"It may take a few moments for ${myCFServerName} to start processing\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"CFML templates. This is normal.\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"--------------------------------------------------------\\"" >> $TomcatControlScript`;
TEMP=`echo " else" >> $TomcatControlScript`;
TEMP=`echo " echo \\"[ALREADY RUNNING]\\"" >> $TomcatControlScript`;
TEMP=`echo " fi" >> $TomcatControlScript`;
TEMP=`echo "}" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "stop() {" >> $TomcatControlScript`;
TEMP=`echo " echo -n \\" * Shutting down ${myCFServerName}: \\"" >> $TomcatControlScript`;
TEMP=`echo " findpid" >> $TomcatControlScript`;
TEMP=`echo " if [ \\$PID_FOUND -eq 1 ] ; then" >> $TomcatControlScript`;
TEMP=`echo " su -p -s /bin/sh \\$TOMCAT_OWNER \\$CATALINA_HOME/bin/shutdown.sh 10 &" >> $TomcatControlScript`;
TEMP=`echo " COUNT=0" >> $TomcatControlScript`;
TEMP=`echo " while [ \\$PID_FOUND -eq 1 ] ; do" >> $TomcatControlScript`;
TEMP=`echo " findpid" >> $TomcatControlScript`;
TEMP=`echo " COUNT=\\$((\\$COUNT+1))" >> $TomcatControlScript`;
TEMP=`echo " if [ \\$COUNT -gt 10 ] ; then" >> $TomcatControlScript`;
TEMP=`echo " break" >> $TomcatControlScript`;
TEMP=`echo " fi" >> $TomcatControlScript`;
TEMP=`echo " echo -n \\". \\"" >> $TomcatControlScript`;
TEMP=`echo " # pause while we wait to try again" >> $TomcatControlScript`;
TEMP=`echo " sleep 1" >> $TomcatControlScript`;
TEMP=`echo " done" >> $TomcatControlScript`;
TEMP=`echo " findpid" >> $TomcatControlScript`;
TEMP=`echo " if [ \\$PID_FOUND -eq 1 ] ; then" >> $TomcatControlScript`;
TEMP=`echo " echo \\"[FAIL]\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\" * The Tomcat/${myCFServerName} process is not responding. Forcing shutdown...\\"" >> $TomcatControlScript`;
TEMP=`echo " forcequit" >> $TomcatControlScript`;
TEMP=`echo " else" >> $TomcatControlScript`;
TEMP=`echo " echo \\"[DONE]\\"" >> $TomcatControlScript`;
TEMP=`echo " fi" >> $TomcatControlScript`;
TEMP=`echo " elif [ ! -f \\$CATALINA_PID ] ; then" >> $TomcatControlScript`;
TEMP=`echo " # if the pid file doesn't exist, just say \\"okay\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"[DONE]\\"" >> $TomcatControlScript`;
TEMP=`echo " else" >> $TomcatControlScript`;
TEMP=`echo " echo \\"[Cannot locate Tomcat PID (${singleQuote}cat \\$CATALINA_PID${singleQuote}) ]\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"--------------------------------------------------------\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"If the Tomcat process is still running, either kill the\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"PID directly or use the 'killall' command.\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"IE: # killall java\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"--------------------------------------------------------\\"" >> $TomcatControlScript`;
TEMP=`echo " fi" >> $TomcatControlScript`;
TEMP=`echo "}" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "forcequit() {" >> $TomcatControlScript`;
TEMP=`echo " echo -n \\" * Forcing ${myCFServerName} Shutdown: \\"" >> $TomcatControlScript`;
TEMP=`echo " findpid" >> $TomcatControlScript`;
TEMP=`echo " if [ \\$PID_FOUND -eq 1 ] ; then" >> $TomcatControlScript`;
TEMP=`echo " # if the PID is still running, force it to die" >> $TomcatControlScript`;
TEMP=`echo " # su -p -s /bin/sh \\$TOMCAT_OWNER $CATALINA_HOME/bin/shutdown.sh -force" >> $TomcatControlScript`;
TEMP=`echo " kill -9 \\$PIDNUMBER" >> $TomcatControlScript`;
TEMP=`echo " rm -rf \\$CATALINA_PID" >> $TomcatControlScript`;
TEMP=`echo " echo \\"[DONE]\\"" >> $TomcatControlScript`;
TEMP=`echo " else" >> $TomcatControlScript`;
TEMP=`echo " # there is no PID, tell the user." >> $TomcatControlScript`;
TEMP=`echo " echo \\"[FAIL]\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"--------------------------------------------------------\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"No Tomcat PID found. If the Tomcat process is still\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"active under a different PID, please kill it manually.\\"" >> $TomcatControlScript`;
TEMP=`echo " echo \\"--------------------------------------------------------\\"" >> $TomcatControlScript`;
TEMP=`echo " fi" >> $TomcatControlScript`;
TEMP=`echo "}" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "status() {" >> $TomcatControlScript`;
TEMP=`echo " findpid" >> $TomcatControlScript`;
TEMP=`echo " if [ \\$PID_FOUND -eq 1 ] ; then" >> $TomcatControlScript`;
TEMP=`echo " echo \\" * ${myCFServerName}/Tomcat is running (PID: \\$PIDNUMBER)\\"" >> $TomcatControlScript`;
TEMP=`echo " else" >> $TomcatControlScript`;
TEMP=`echo " echo \\" * PID not found.\\"" >> $TomcatControlScript`;
TEMP=`echo " fi" >> $TomcatControlScript`;
TEMP=`echo "}" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "case \\"\\$1\\" in" >> $TomcatControlScript`;
TEMP=`echo " start)" >> $TomcatControlScript`;
TEMP=`echo " start" >> $TomcatControlScript`;
TEMP=`echo " ;;" >> $TomcatControlScript`;
TEMP=`echo " stop)" >> $TomcatControlScript`;
TEMP=`echo " stop" >> $TomcatControlScript`;
TEMP=`echo " ;;" >> $TomcatControlScript`;
TEMP=`echo " forcequit)" >> $TomcatControlScript`;
TEMP=`echo " forcequit" >> $TomcatControlScript`;
TEMP=`echo " ;;" >> $TomcatControlScript`;
TEMP=`echo " restart)" >> $TomcatControlScript`;
TEMP=`echo " stop" >> $TomcatControlScript`;
TEMP=`echo " sleep 5" >> $TomcatControlScript`;
TEMP=`echo " start" >> $TomcatControlScript`;
TEMP=`echo " ;;" >> $TomcatControlScript`;
TEMP=`echo " status)" >> $TomcatControlScript`;
TEMP=`echo " status" >> $TomcatControlScript`;
TEMP=`echo " ;;" >> $TomcatControlScript`;
TEMP=`echo " *)" >> $TomcatControlScript`;
TEMP=`echo " echo \\" * Usage: \\$0 {start|stop|restart|forcequit|status}\\"" >> $TomcatControlScript`;
TEMP=`echo " exit 1" >> $TomcatControlScript`;
TEMP=`echo " ;;" >> $TomcatControlScript`;
TEMP=`echo "esac" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
TEMP=`echo "exit 0" >> $TomcatControlScript`;
TEMP=`echo "" >> $TomcatControlScript`;
# make it executable
chmod 744 $TomcatControlScript;
# see if there's a control script in the init directory
if [ -f /etc/init.d/${myControlScriptName} ]; then
# if there is, copy the new control script over it
cp -f $TomcatControlScript /etc/init.d/${myControlScriptName};
fi
}
#####################
# Run function list #
#####################
createUserAndGroup;
rebuildControlScript;
updateInstallDir;