308 lines
7.3 KiB
Bash
308 lines
7.3 KiB
Bash
#!/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 "$@" |