#!/bin/bash # 脚本名称 # SCRIPT_NAME="ktouch-fix-daemon" SCRIPT_NAME=$0 service_name="ktouch_daemon.service" SERVICE_FILE="/etc/systemd/system/ktouch_daemon.service" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 打印函数 print_info() { echo -e "${GREEN}[INFO ]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARN ]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } print_question() { echo -e "${BLUE}[ ? ]${NC} $1" } # 检查并获取root权限 check_root() { if [[ $EUID -ne 0 ]]; then print_info "需要root权限来修改系统服务" if sudo -n true 2>/dev/null; then print_info "权限已自动获取,重启脚本" # 已经有sudo权限,直接重新运行脚本 exec sudo "$0" "$@" else # 需要输入密码 print_info "请输入sudo密码" exec sudo "$0" "$@" fi fi } # 检查用户是否存在 check_user_exists() { local username="$1" if id "$username" &>/dev/null; then return 0 else return 1 fi } # 获取系统所有用户名列表 get_all_users() { # 获取所有普通用户和系统用户(UID >= 1000 或 UID < 1000但具有登录shell) # getent passwd | cut -d: -f1 | sort awk -F: '$3 >= 1000 && $7 ~ /\/(bash|sh|zsh|csh|ksh)$/ {print $1}' /etc/passwd } # 停止服务 stop_service() { local service_name="ktouch_daemon.service" print_info "停止 $service_name 服务..." if systemctl is-active --quiet "$service_name"; then systemctl stop "$service_name" if [[ $? -eq 0 ]]; then print_info "服务已停止" else print_error "停止服务失败" return 1 fi else print_info "服务未运行" fi return 0 } # 禁用服务自启动 disable_service() { local service_name="ktouch_daemon.service" print_info "禁用服务自启动..." if systemctl is-enabled --quiet "$service_name" 2>/dev/null; then systemctl disable "$service_name" if [[ $? -eq 0 ]]; then print_info "服务自启动已禁用" else print_error "禁用服务自启动失败" return 1 fi else print_info "服务自启动未启用" fi return 0 } # 修改服务文件中的用户名 modify_service_user() { local service_file="$1" local new_user="$2" local backup_file="${service_file}.backup.$(date +%Y%m%d_%H%M%S)" print_info "备份服务文件: $backup_file" cp "$service_file" "$backup_file" print_info "修改服务文件中的用户名..." # 检查服务文件是否包含User=行 if grep -q "^User=" "$service_file"; then # 替换现有的User=行 sed -i "s/^User=.*/User=$new_user/" "$service_file" else # 在[Service]部分添加User=行 if grep -q "\[Service\]" "$service_file"; then sed -i "/\[Service\]/a User=$new_user" "$service_file" else # 如果没有[Service]部分,在文件末尾添加 echo -e "\n[Service]\nUser=$new_user" >> "$service_file" fi fi if [[ $? -eq 0 ]]; then print_info "服务文件修改成功" return 0 else print_error "服务文件修改失败" # 恢复备份 cp "$backup_file" "$service_file" return 1 fi } # 重新加载systemd配置 reload_systemd() { print_info "重新加载systemd配置..." systemctl daemon-reload if [[ $? -eq 0 ]]; then print_info "systemd配置已重新加载" return 0 else print_error "重新加载systemd配置失败" return 1 fi } # 启用服务自启动 enable_service() { local service_name="ktouch_daemon.service" print_info "启用服务自启动..." systemctl enable "$service_name" if [[ $? -eq 0 ]]; then print_info "服务自启动已启用" return 0 else print_error "启用服务自启动失败" return 1 fi } # 启动服务 start_service() { local service_name="ktouch_daemon.service" print_info "启动服务..." systemctl start "$service_name" if [[ $? -eq 0 ]]; then print_info "服务已启动" return 0 else print_error "启动服务失败" print_info "可以使用 'systemctl status $service_name' 查看详细错误信息" return 1 fi } # 显示服务状态 show_service_status() { local service_name="ktouch_daemon.service" print_info "当前服务状态:" systemctl status "$service_name" --no-pager -l } # 主函数 main() { print_info "=== ktouch_daemon 服务用户修改工具 ===" if [ ! -f $SERVICE_FILE ];then print_error "服务文件不存在,请重新安装ktouch软件!" exit 1 fi # 检查root权限 check_root "$@" # 显示当前服务配置 print_info "当前服务配置:" grep -E "User=" "$SERVICE_FILE" 2>/dev/null || print_warning "无法获取当前配置" # 获取用户名 while true; do echo print_question "正在修改 ktouch_daemon 监控服务的执行用户,请在下面输入需要执行的用户名" echo -n "用户名: " read -r username # 检查输入是否为空 if [[ -z "$username" ]]; then print_error "用户名不能为空,请重新输入" continue fi # 检查用户是否存在 if check_user_exists "$username"; then # print_info "用户 '$username' 存在" break else print_error "用户 '$username' 不存在,请重新输入" print_info "可用的用户列表:" get_all_users | head -10 | tr '\n' ' ' echo -e "\n(显示前10个用户,完整列表请查看 /etc/passwd)" fi done # 确认操作 echo print_info "即将执行以下操作:" print_info "1. 停止 ktouch_daemon.service 服务" print_info "2. 禁用服务自启动" print_info "3. 修改服务文件中的用户为: $username" print_info "4. 重新启用服务自启动" print_info "5. 启动服务" echo echo -n " 是否继续? (y/N): " read -r confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then print_info "操作已取消" exit 0 fi # 执行操作 echo print_info "开始修改服务配置..." # 停止服务 if ! stop_service; then exit 1 fi # 禁用服务自启动 if ! disable_service; then exit 1 fi # 修改服务文件 if ! modify_service_user "$SERVICE_FILE" "$username"; then print_error "修改失败!" exit 1 fi # 重新加载systemd配置 if ! reload_systemd; then exit 1 fi # 启用服务自启动 if ! enable_service; then exit 1 fi # 启动服务 if ! start_service; then exit 1 fi # 显示最终状态 echo print_info "=== 操作完成 ===" show_service_status echo print_info "服务用户已成功修改为: $username" } # 错误处理 set -euo pipefail # 执行主函数 main "$@"