Files
ktouchV2/opt/ktouch/kscreen-fix-daemon
2026-06-12 16:54:32 +08:00

308 lines
7.3 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"