Linux服务器,作者使用centos7操作系统,支持裸机安装JDK或者没有安装过JDK的用户安装JDK。
拥有root用户使用权
将安装脚本和JDK安装包(tar.gz包)拷贝至服务器上。
通过root用户 执行脚本,例如:sh installJDK.sh gudong /opt/software
。
脚本执行参数说明:
脚本提示安装成功之后,即可验证使用。安装详情,可在日志文件installJDK_log_${yyyy_mm_dd}.log
中找到。文件在脚本同级目录。
#!/bin/bash
# Author : Donny
# History :
# 2022/08/24 Version1 安装JDK(tar.gz)
# Program : 在Centos7中实现JDK tar.gz的安装,仅仅支持裸机安装JDK,使用root用户执行脚本
# root用户安装路径:/root/software
# 非root用户安装路径:/home/${jdkUser}/software
#####################################################################################
# Incoming parameter area
# 安装jdk的用户
jdkUser=$1
# 安装包所在的地址路径(绝对路径)
sourcePath=$2
# Buildin function area
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 日志模块 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 初始化日志模块
function initLogModule() {
# 初始化日志输出
logPath=$(pwd)
# 脚本日志目录
LogFile="$logPath/installJDK_log_$(date +%F).log"
# 创建日志文件
if ! [ -f "${LogFile}" ]; then
touch "$LogFile"
fi
echo "日志文件为: ${LogFile}"
}
# 输出红色高亮字体并标记ERROR
function echo_error() {
echo -e "\033[1;31m$1\033[0m"
[ -n "${LogFile}" ] && echo "$(date +%F\ %T,%N | cut -c1-23) [ERROR] $1" >>"${LogFile}"
}
# 输出默认字体并标记INFO
function echo_info() {
echo -e "$1"
[ -n "${LogFile}" ] && echo "$(date +%F\ %T,%N | cut -c1-23) [INFO ] $1" >>"${LogFile}"
}
# 输出绿色字体并标记INFO
function echo_green() {
echo -e "\033[32m$1\033[0m"
[ -n "${LogFile}" ] && echo "$(date +%F\ %T,%N | cut -c1-23) [INFO ] $1" >>"${LogFile}"
}
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 日志模块 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# 验证执行环境
function vaildateEx() {
current=$(whoami)
# 0.用户检查
if [[ "root" != "$current" ]]; then
echo -e "\033[1;31m请使用root用户执行脚本!\033[0m"
exit 1
fi
# 1.参数检查
if [[ -z "${jdkUser}" || -z "${sourcePath}" ]]; then
echo -e "\033[1;31m请输入正确参数:
第一个参数为安装jdk的用户,
第二个参数为安装包所在的地址路径(绝对路径).
例如: sh $0 root /opt \033[0m"
exit 1
# 2.检查路径是否非法
elif ! [ -d "${sourcePath}" ]; then
echo -e "\033[1;31m安装包目录${sourcePath}不存在\033[0m"
exit 1
fi
# 3.检查jdk安装包
if jarTar=$(ls "${sourcePath}"/*jdk-*.tar.gz); then
count=$(echo "${jarTar}" | wc -l)
if [ "1" != "${count}" ]; then
echo_error "检查到有${count}个安装包,请确认${sourcePath}中只有一个JDK安装包!检测条件:*jdk-*.tar.gz"
exit 1
fi
fi
# 4.检查用户是否已安装java
if [ "root" != "${jdkUser}" ]; then
# 执行返回值0代表java命令可以使用说明用户已经安装了JDK,若java命令不能执行则说明用户尚未安装jdk需要安装
if sudo su - "${jdkUser}" -c 'java -version >&/dev/null && exit 0 || exit 1'; then
echo_error "${jdkUser}用户已安装JDK。"
exit 1
fi
else
javaVersion=$(java -version 2>&1 | grep 'java version' | sed -e 's/"//g' | awk '{print $3}')
if [[ -n "${javaVersion}" ]]; then
echo_error "${jdkUser}用户已安装JDK,版本${javaVersion}。"
exit 1
fi
fi
echo_info "在用户${jdkUser}下安装JDK,JDK安装包为${jarTar}"
if [ "root" != "${jdkUser}" ]; then
echo_info "安装目录: /home/${jdkUser}/software"
else
echo_info "安装目录: /root/software"
fi
}
# 创建jdk的安装用户
function createJdkUser() {
if [ "root" != "${jdkUser}" ]; then
# 创建es用户和用户组
if ! grep "^${jdkUser}" /etc/group >&/dev/null; then
groupadd "${jdkUser}" -g 750
fi
if ! grep "^${jdkUser}" /etc/passwd >&/dev/null; then
useradd -g "${jdkUser}" -u 750 "${jdkUser}"
fi
fi
}
# 非root用户安装JDK执行程序
function nonRootInstall() {
# 创建用户软件安装目录
mkdir -p /home/"${jdkUser}"/software
echo_info "开始解压${jarTar}"
tar -zxf "${jarTar}" -C /home/"${jdkUser}"/software/
echo_info "解压完成,开始配置jdk环境变量"
if ! jdkdPath=$(ls -d /home/"${jdkUser}"/software/jdk*_*/); then
echo_error "jdk安装包解压出来没有jdk文件夹!检测条件:jdk*_*"
exit 1
fi
jdkdcount=$(echo "${jdkdPath}" | wc -l)
if [ "1" != "${jdkdcount}" ]; then
echo_error "检查到有${jdkdcount}个jdk解压包,请确认/home/${jdkUser}/software/中只有一个JDK安装包!检测条件:jdk*_*"
exit 1
fi
jdkdPath=${jdkdPath::-1}
# 配置jdk环境变量
## 增加以下配置项
sed -i '$a \ ' /home/"$jdkUser"/.bashrc
sed -i '$a # jdk configuration items' /home/"$jdkUser"/.bashrc
sed -i '$a export JAVA_HOME='${jdkdPath}'' /home/"$jdkUser"/.bashrc
sed -i '$a export JRE_HOME=${JAVA_HOME}/jre' /home/"$jdkUser"/.bashrc
sed -i '$a export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH' /home/"$jdkUser"/.bashrc
sed -i '$a export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin' /home/"$jdkUser"/.bashrc
sed -i '$a export PATH=$PATH:${JAVA_PATH}' /home/"$jdkUser"/.bashrc
# 确认用户权限
chown -R "${jdkUser}":"${jdkUser}" /home/"${jdkUser}/"
## 编译,让配置生效
# shellcheck source=/dev/null
if sudo su - "${jdkUser}" -c 'java -version >&/dev/null && exit 0 || exit 1'; then
echo_info "jdk环境变量配置完成"
else
echo_error "jdk环境变量配置失败"
exit 1
fi
}
# root用户安装JDK执行程序
function rootInstallJdk() {
# 创建用户软件安装目录
mkdir -p /root/software
echo_info "开始解压${jarTar}"
tar -zxf "${jarTar}" -C /root/software/
echo_info "解压完成,开始配置jdk环境变量"
if ! jdkdPath=$(ls -d /root/software/jdk*_*/); then
echo_error "jdk安装包解压出来没有jdk文件夹!检测条件:jdk*_*"
exit 1
fi
jdkdcount=$(echo "${jdkdPath}" | wc -l)
if [ "1" != "${jdkdcount}" ]; then
echo_error "检查到有${jdkdcount}个jdk解压包,请确认/root/software/中只有一个JDK安装包!检测条件:jdk*_*"
exit 1
fi
jdkdPath=${jdkdPath::-1}
## 增加以下配置项
sed -i '$a \ ' ~/.bashrc
sed -i '$a # jdk configuration items' ~/.bashrc
sed -i '$a export JAVA_HOME='${jdkdPath}'' ~/.bashrc
sed -i '$a export JRE_HOME=${JAVA_HOME}/jre' ~/.bashrc
sed -i '$a export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH' ~/.bashrc
sed -i '$a export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin' ~/.bashrc
sed -i '$a export PATH=$PATH:${JAVA_PATH}' ~/.bashrc
echo_info "jdk环境变量生效"
## 编译,让配置生效
# shellcheck source=/dev/null
source ~/.bashrc
javaVersion=$(java -version 2>&1 | grep 'java version' | sed -e 's/"//g' | awk '{print $3}')
if [[ -n "${javaVersion}" ]]; then
echo_green "jdk环境变量配置完成"
else
echo_error "jdk环境变量配置失败"
exit 1
fi
}
# Execute body area
# 日志初始化
initLogModule
echo_info "参数提示:
第一个参数为安装jdk的用户,
第二个参数为安装包所在的地址路径(绝对路径).
例如: sh $0 root /opt"
echo_info "=================== 安装前检查begin ==================="
# 验证执行条件
vaildateEx
echo_green "=================== 安装前检查end ==================="
echo_info "=================== 创建安装用户和用户组begin ==================="
if [ "root" != "${jdkUser}" ]; then
echo_info "非root用户,创建用户"
createJdkUser
else
echo_info "root用户,不创建用户"
fi
echo_green "=================== 创建安装用户和用户组end ==================="
echo_info "=================== JDK 安装begin ==================="
if [ "root" != "${jdkUser}" ]; then
nonRootInstall
else
rootInstallJdk
fi
echo_green "=================== JDK 安装end ==================="
echo_green "=================== 恭喜! JDK安装成功! ==================="
# Return value area
exit 0