Linux常用软件安装脚本

160 阅读7分钟

Linux常用软件安装脚本

一、引言

在Linux系统中,安装常用软件是日常运维和系统管理工作的重要部分。通过编写一个脚本,我们可以自动化地完成这些软件的安装过程,提高工作效率。本文将详细介绍一个Linux常用软件安装脚本的编写过程,包括脚本的设计思路、表格列出所需安装的软件、具体的脚本代码、代码运行流程图等。

二、脚本设计思路

  1. 需求分析

    • 确定需要安装的软件及其版本。
    • 确定软件的安装路径和配置文件路径。
    • 确定脚本的运行环境(如Linux发行版)。
  2. 脚本结构

    • 脚本头部:包含脚本说明、版本信息、作者信息等。
    • 变量定义:定义安装路径、安装包名称等变量。
    • 函数定义:定义安装、卸载、启动、停止等功能的函数。
    • 主菜单:提供用户选择安装、卸载、启动、停止等操作的界面。
    • 脚本入口点:调用主菜单函数。
  3. 权限检查

    • 确保脚本以root权限运行,因为安装软件通常需要写入系统目录。
  4. 错误处理

    • 在关键步骤添加错误检查,如检查安装包是否存在、安装目录是否存在等。
    • 提供用户友好的错误信息。
  5. 日志记录

    • 将安装过程中的关键信息记录到日志文件中,以便后续排查问题。

三、所需安装的软件及版本

以下是需要安装的常用软件及其版本的表格:

序号软件名称版本号安装路径
1JDKjdk1.8.0_291/usr/local/java
2Nginx1.21.6/usr/local/nginx
3Redis7.0.5/usr/local/redis
4达梦        最新        /usr/local/dangmeng
5人大金仓                最新/usr/local/kingbase

四、脚本代码

以下是详细的脚本代码,包括JDK、Nginx、Redis、达梦 和人大金仓的安装过程:

#!/bin/bash

# 定义 JDK 安装目录变量
JDK_INSTALL_DIR="/usr/local/java"

# 定义 JDK 安装包文件名变量
JDK_TARBALL="jdk1.8.0_291.tar.gz"

# 安装 JDK
function installJava() {
    echo "开始安装 JDK..."
    # 判断 $JDK_INSTALL_DIR 目录是否存在,不存在则创建
    if [ ! -d "$JDK_INSTALL_DIR" ]; then
        echo "创建目录 $JDK_INSTALL_DIR..."
        mkdir -p "$JDK_INSTALL_DIR"
    fi

    # 判断JDK安装包是否在当前目录
    if [ ! -f "$JDK_TARBALL" ]; then
        echo "JDK 安装包 $JDK_TARBALL 不存在,请确保路径正确"
        return 1
    fi

    # 拷贝JDK安装包到 $JDK_INSTALL_DIR 目录
    cp "$JDK_TARBALL" "$JDK_INSTALL_DIR"

    # 切换到 $JDK_INSTALL_DIR 目录
    cd "$JDK_INSTALL_DIR"

    # 解压JDK安装包
    tar -zxvf "$JDK_TARBALL"

    # 获取解压后的JDK目录名
    JDK_DIR=$(ls -d jdk* | head -1)

    # 编辑 /etc/profile 文件
    echo "export JAVA_HOME=$JDK_INSTALL_DIR/$JDK_DIR" >> /etc/profile
    echo "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profile
    echo "export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /etc/profile

    # 使 /etc/profile 中的新环境变量立即生效
    source /etc/profile

    # 输出 Java 版本以验证安装
    echo "JDK 安装完成。"
    java -version
}

# 卸载 JDK
function uninstallJava() {
    echo "开始卸载 JDK..."
    # 从 /etc/profile 中移除 JAVA_HOME
    sed -i "/JAVA_HOME/d" /etc/profile
    sed -i "s|:$JDK_INSTALL_DIR/jdk*/bin||" /etc/profile
    echo "export PATH=$PATH" >> /etc/profile

    # 删除 JDK 目录
    if [ -d "$JDK_INSTALL_DIR/jdk*" ]; then
        rm -rf "$JDK_INSTALL_DIR/jdk*"
    else
        echo "JDK 目录不存在,卸载终止。"
        return 1
    fi

    # 使更改生效
    source /etc/profile

    echo "JDK 卸载完成。"
}

# 主菜单函数
function mainMenu() {
    echo "请选择一个选项:"
    echo "1) 安装 JDK1"
    echo "2) 卸载 JDK"
    read -p "输入你的选择(1-2):" choice

    case $choice in
        1)
            installJava
            ;;
        2)
            uninstallJava
            ;;
        *)
            echo "无效的选项,请输入 1 或 2。"
            ;;
    esac
}

# 脚本入口点
mainMenu

 # Redis安装目录变量
REDIS_INSTALL_DIR="/usr/local/redis"
# Redis安装包文件名变量
REDIS_TARBALL="redis-7.0.5.tar.gz"
# Redis下载URL(可选)
REDIS_URL="https://example.com/download/$REDIS_TARBALL"
# 安装Nginx
install_nginx() {
    # 安装依赖库
    yum install -y $NGINX_DEPS
    check_dir_exists $NGINX_INSTALL_DIR
    download_package $NGINX_URL $NGINX_TARBALL
    tar -zxvf $NGINX_TARBALL -C /usr/local/src
    cd /usr/local/src/nginx-$NGINX_VERSION
    ./configure --prefix=$NGINX_INSTALL_DIR --with-http_ssl_module --with-stream --with-mail --with-pcre --with-zlib=../zlib-$ZLIB_VERSION --with-openssl=../openssl-$OPENSSL_VERSION
    make
    make install
    echo "$(date): Nginx 安装完成。" | tee -a $LOG_FILE
}

#!/bin/bash

# 定义Redis安装目录变量
REDIS_INSTALL_DIR="/usr/local/redis"

# 定义Redis压缩包文件名变量
REDIS_TARBALL="redis-7.0.5.tar.gz"

# 定义Redis解压后的目录名变量
REDIS_DIR_NAME="redis-7.0.5"

# 函数:检查目录是否存在
check_dir_exists() {
    if [ ! -d "$1" ]; then
        echo "目录 $1 不存在。"
        echo "请创建该目录后再尝试安装。"
        return 1 # 返回一个错误码表示目录不存在
    fi
}

# 函数:安装Redis
install_redis() {
    # 检查安装目录是否存在
    check_dir_exists "$REDIS_INSTALL_DIR"
    if [ $? -ne 0 ]; then
        return 1
    fi
    # 如果一切检查通过,继续安装过程
    echo "开始安装Redis..."
    # 进入解压后的Redis目录
    cd "$REDIS_DIR_NAME"
    # 解压Redis安装包
    tar -xzvf "$REDIS_TARBALL"
    # 编译并安装Redis到$REDIS_INSTALL_DIR目录
    make PREFIX="$REDIS_INSTALL_DIR" install
    # 将Redis的配置文件复制到$REDIS_INSTALL_DIR/bin目录下
    cp redis.conf "$REDIS_INSTALL_DIR"/bin/
    # 切换到$REDIS_INSTALL_DIR/bin目录
    cd "$REDIS_INSTALL_DIR"/bin

    # 后台启动Redis服务
#    ./redis-server "$REDIS_INSTALL_DIR"/bin/redis.conf &

    echo "Redis安装完成。"
}

# 定义函数:启动Redis
start_redis() {
    echo "启动Redis服务..."
    "$REDIS_INSTALL_DIR"/bin/redis-server /usr/local/redis/bin/redis.conf
}

# 定义函数:后台启动Redis
background_start_redis() {
    echo "后台启动Redis服务..."
   "$REDIS_INSTALL_DIR"/bin/redis-server /usr/local/redis/bin/redis.conf &
    echo "Redis服务已在后台启动。"
}
# 定义函数:停止Redis
stop_redis() {
	ps -ef |grep redis
    pkill -x "redis-server"
	echo "停止所有Redis服务..."
	ps -ef |grep redis
}

# 定义函数:卸载Redis
uninstall_redis() {
    # 检查Redis服务是否正在运行
    if pgrep -x "redis-server" > /dev/null; then
        echo "Redis服务正在运行。"
        echo "请先关闭Redis服务再进行卸载。"
        return 1
    else
        echo "Redis服务未运行,可以进行卸载。"
    fi

    echo "删除Redis可执行文件..."
    rm -rf "$REDIS_INSTALL_DIR"/bin
    echo "删除Redis文件..."
    rm -rf "$REDIS_INSTALL_DIR/$REDIS_DIR_NAME"

	# 删除pid文件
	echo "删除pid文件..."
	rm -rf /var/run/redis_*.pid
    echo "Redis已卸载。"
}

# 主菜单函数
show_menu() {
    echo "请选择操作:"
    echo "1) 安装Redis"
    echo "2) 启动Redis"
    echo "3) 后台启动Redis"
	echo "4) 停止Redis"
    echo "5) 卸载Redis"
    echo "6) 退出"
    read -p "输入选项1:" option
    case $option in
        1) install_redis ;;
        2) start_redis ;;
        3) background_start_redis ;;
		4) stop_redis ;;
        5) uninstall_redis ;;
        6) exit ;;
        *) echo "无效选项。" ;;
    esac
}

# 确保脚本以root权限运行
if [ "$(id -u)" != "0" ]; then
    echo "该脚本必须以root权限运行" 1>&2
    exit 1
fi

# 显示主菜单
while true; do
    show_menu
done

#!/bin/bash

:
   # 查看文档 https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html
:
# 函数:创建达梦数据库用户和用户组
save_user(){
    echo "1、创建达梦安装用户和用户组..."
    # 检查用户组是否存在,不存在则创建
    if ! grep -q "^dinstall:" /etc/group; then
        groupadd -g 12349 dinstall
        echo "用户组 dinstall 创建成功。"
    else
        echo "用户组 dinstall 已存在。"
    fi

    # 检查用户是否存在,不存在则创建
    if ! id -u dmdba &>/dev/null; then
        useradd -u 12345 -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
        echo "用户 dmdba 创建成功。"
    else
        echo "用户 dmdba 已存在。"
    fi
    echo "创建达梦安装用户和用户组完成"
}
# 函数:设置文件句柄限制
set_nofile_limit() {
   echo "2、添加limits.conf配置..."
       # 定义limits.conf文件的路径
    limits_conf="/etc/security/limits.conf"

    # 检查软限制是否已经设置
    if ! grep -q "* soft nofile 65536" "$limits_conf"; then
        echo "* soft nofile 65536" >> "$limits_conf"
    fi

    # 检查硬限制是否已经设置
    if ! grep -q "* hard nofile 65536" "$limits_conf"; then
        echo "* hard nofile 65536" >> "$limits_conf"
    fi
    echo "添加limits.conf配置完成"

}
# 定义达梦数据库的安装目录变量


# 函数:创建达梦数据库目录并设置所有权
mkdir_dameng_directories() {
  dameng_install_dir="/usr/local/dameng"

   echo "4、达梦数据库目录创建..."
    # 创建达梦数据库的根目录,如果不存在
    if [ ! -d "$dameng_install_dir" ]; then
        mkdir -p "$dameng_install_dir"
        echo "创建目录 $dameng_install_dir"
    else
        echo "目录 $dameng_install_dir 已存在"
    fi

    # 更改目录所有权为dmdba用户
    chown dmdba "$dameng_install_dir"
    echo "更改目录 $dameng_install_dir 的所有权为 dmdba 用户"

    # 定义子目录列表
    local sub_dirs=("dmdbms" "dmdata" "dmdata/data")

    # 切换到dmdba用户并为每个子目录执行操作
    for dir in "${sub_dirs[@]}"; do
        local full_dir="$dameng_install_dir/$dir"
        if [ ! -d "$full_dir" ]; then
            su dmdba -c "mkdir -p '$full_dir'"
            echo "为 dmdba 用户创建目录 $full_dir"
        else
            echo "目录 $full_dir 已存在"
        fi
    done

    echo "达梦数据库目录创建完成"
}
# ISO文件路径
ISO_PATH="/opt/dm/dm8_20240712_x86_rh7_64.iso"
# 挂载点路径
MOUNT_POINT="/opt/dm/dm"

# 函数:挂载ISO文件
mount_iso() {
     echo "3、挂载开始..."
    # 挂载ISO文件
    mount -o loop "$ISO_PATH" "$MOUNT_POINT"
    if [ $? -eq 0 ]; then
        echo "ISO文件已成功挂载到 $MOUNT_POINT"
    else
        echo "错误:挂载ISO文件失败"
        return 1
    fi
       echo "3、挂载成功..."

}
# 函数:安装Dm前准备步骤
saveDmEnv() {

    save_user
    set_nofile_limit
    # 挂载
    mount_iso
    mkdir_dameng_directories
    echo "请切换到dmdba "+",到" "$ISO_PATH" "$MOUNT_POINT" "执行./DMInstall.bin  -i"
}

# 主菜单函数
show_menu() {
    echo "请选择操作:"
    echo "1) 安装Dm环境"
    echo "2) 退出"
    read -p "输入选项" option
    case $option in
        1) saveDmEnv ;;
        2) exit ;;
        *) echo "无效选项。" ;;
    esac
}
#  安装  ./DMInstall.bin  -i
#  初始化数据库示例
#   新版本取消LENGTH_IN_CHAR=1
#   ./dminit PATH=/usr/local/dameng/dmdata/data  PAGE_SIZE=32  CASE_SENSITIVE=0 CHARSET=1     DB_NAME=DAMENG  INSTANCE_NAME=DMSERVER  PORT_NUM=5236  新版本
#  ./dminit PATH=/usr/local/dameng/dmdata/data  PAGE_SIZE=32  CASE_SENSITIVE=0 CHARSET=1 LENGTH_IN_CHAR=1   DB_NAME=DAMENG  INSTANCE_NAME=DMSERVER  PORT_NUM=5236 旧版本

#  创建数据库服务
#  su root
#  cd /usr/local/dameng/dmdbms/script/root
# ./dm_service_installer.sh -t dmserver -p DMSERVER1 -dm_ini /usr/local/dameng/dmdata/data/DAMENG/dm.ini

# 启动  systemctl start DmServiceDMSERVER
# 查看状态 systemctl status DmServiceDMSERVER
# 停止  systemctl stop DmServiceDMSERVER


#卸载
 #1:关闭数据库服务(DmServiceDMSERVER实例服务)
 #例:安装目录bin下执行:./DmServiceDMSERVER stop
 #2:删除数据库实例(如果数据放在安装目录的data下,删除data目录就可以)
 #例:rm -rf data
 #3:卸载数据库软件
 #例:使用root执行:./uninstall.sh -i
# 显示主菜单
while true; do
    show_menu
done

#!/bin/bash

:
   # 查看文档 https://help.kingbase.com.cn/v8/install-updata/install-linux/install-linux-2.html
:
# 函数:创建人大金仓据库用户
save_user(){
    echo "1、创建人大金仓据库用户..."
   # 用户名和密码
   username="kingbase"
   password="kingbase"
   # 检查用户名是否已经存在
   if id "$username" &>/dev/null; then
       echo "用户 $username 已存在。"
   else
       # 创建用户
       sudo useradd -m "$username"
       echo "用户 $username 创建成功。"

       # 设置密码
       echo "$username:$password" | sudo chpasswd
       echo "密码已设置为 $password。"
   fi
    echo "创建人大金仓据库用户完成"
}
# 函数:新建安装目录
#!/bin/bash

mkdir_dir() {
    echo "2、创建人大金金仓安装目录..."

    # 定义安装目录的父目录
    parent_dir="/usr/local/kingbaseES"

    # 检查父目录是否存在,如果不存在则创建
    if [ ! -d "$parent_dir" ]; then
        echo "父目录 $parent_dir 不存在,正在创建..."
        mkdir -p "$parent_dir"
        if [ $? -eq 0 ]; then
            echo "父目录 $parent_dir 创建成功。"
        else
            echo "父目录 $parent_dir 创建失败,请检查权限。"
            return 1
        fi
    else
        echo "父目录 $parent_dir 已存在。"
    fi

    # 定义具体的安装目录
    install_dir="$parent_dir/kingbsse"
    data_dir="$parent_dir/data"

    # 检查安装目录是否存在,如果不存在则创建
    if [ ! -d "$install_dir" ]; then
        echo "安装目录 $install_dir 不存在,正在创建..."
        mkdir -p "$install_dir"
        if [ $? -eq 0 ]; then
            echo "安装目录 $install_dir 创建成功。"
        else
            echo "安装目录 $install_dir 创建失败,请检查权限。"
            return 1
        fi
    else
        echo "安装目录 $install_dir 已存在。"
    fi

    # 检查数据目录是否存在,如果不存在则创建
    if [ ! -d "$data_dir" ]; then
        echo "数据目录 $data_dir 不存在,正在创建..."
        mkdir -p "$data_dir"
        if [ $? -eq 0 ]; then
            echo "数据目录 $data_dir 创建成功。"
        else
            echo "数据目录 $data_dir 创建失败,请检查权限。"
            return 1
        fi
    else
        echo "数据目录 $data_dir 已存在。"
    fi

    # 改变目录所有者为kingbase用户
    chown -R kingbase:kingbase "$parent_dir"

    # 赋予kingbase用户读写执行权限
    chmod -R 755 "$parent_dir"

    echo "创建人大金金仓安装目录完成"
}


# ISO文件路径
ISO_PATH="/opt/kingbase/KingbaseES_V009R001C001B0030_Lin64_install.iso"
# 挂载点路径
MOUNT_POINT="/opt/kingbase/kingbase"

# 函数:挂载ISO文件
mount_iso() {
     echo "3、挂载开始..."
    # 挂载ISO文件
    mount -o loop "$ISO_PATH" "$MOUNT_POINT"
    if [ $? -eq 0 ]; then
        echo "ISO文件已成功挂载到 $MOUNT_POINT"
    else
        echo "错误:挂载ISO文件失败"
        return 1
    fi
       echo "3、挂载成功..."

}
# 函数:安装Dm前准备步骤
saveDmEnv() {

    save_user
    mkdir_dir
    # 挂载
    mount_iso
    echo "人大金仓安装前准备就绪,请参照https://help.kingbase.com.cn/v8/install-updata/install-linux/install-linux-3.html 安装,注意:请切换到kingbase用户执行后续操作"
}

#启动服务
#sys_ctl -w start -D ${/usr/local/kingbaseES/data} -l "${/usr/local/kingbaseES/data}/sys_log/startup.log"
#停止服务
#sys_ctl stop -m fast -w -D ${Data文件目录}
# 主菜单函数
show_menu() {
    echo "请选择操作:"
    echo "1) 安装人大金仓环境"
    echo "2) 退出"
    read -p "输入选项" option
    case $option in
        1) saveDmEnv ;;
        2) exit ;;
        *) echo "无效选项。" ;;
    esac
}


# 显示主菜单
while true; do
    show_menu
done