You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否创建在用户交互前启动的systemd服务?实现登录前阻止输入

当然可以实现这个需求!核心思路是让你的自定义systemd服务在负责输出登录提示的getty服务之前启动,同时通过终端控制命令暂时锁住控制台输入,直到你的服务完成任务。下面是具体的实现步骤:

实现步骤

1. 创建自定义systemd服务文件

首先在/etc/systemd/system/目录下创建服务配置文件,比如命名为pre-login-blocker.service:

[Unit]
Description=Pre-login blocker service to prevent user input before initialization
# 确保在所有getty服务之前启动,若只针对tty1,可改为Before=getty@tty1.service
Before=getty.target
Wants=getty.target

[Service]
Type=oneshot
# 执行自定义脚本,指定终端设备确保操作生效
ExecStart=/usr/local/bin/pre-login-block.sh < /dev/tty1 > /dev/tty1 2>&1
# 确保服务执行完成后才继续启动后续服务
RemainAfterExit=no
# 以root权限运行,因为需要修改终端设置
User=root
Group=root

[Install]
WantedBy=multi-user.target

2. 编写预处理脚本

创建/usr/local/bin/pre-login-block.sh脚本,用于暂时阻止输入并执行你的初始化任务:

#!/bin/bash
set -e

# 保存当前终端设置,后续恢复
original_stty=$(stty -g)

# 禁用终端回显和规范模式,阻止用户输入
stty -icanon -echo

# 输出自定义提示(可选)
clear
echo "系统正在进行初始化准备,请不要操作..."

# --------------------------
# 在这里添加你的核心任务
# 比如运行某个初始化程序、检查系统状态等
# 示例:等待5秒模拟任务执行
sleep 5
# --------------------------

# 恢复终端原始设置,确保登录提示正常工作
stty "$original_stty"
clear

3. 设置权限并启用服务

给脚本添加执行权限:

chmod +x /usr/local/bin/pre-login-block.sh

重新加载systemd配置并启用服务:

systemctl daemon-reload
systemctl enable pre-login-blocker.service

关键注意事项

  • 多终端适配:如果需要阻止所有虚拟终端(tty1-tty6)的登录提示,保持Before=getty.target即可;若只需针对特定终端,修改为Before=getty@ttyX.service(X为终端编号,比如tty1)。
  • 容错处理:建议在脚本中加入陷阱捕获(比如trap 'stty "$original_stty"' EXIT),避免因脚本异常崩溃导致终端无法恢复输入功能。
  • 服务依赖:如果你的初始化任务需要依赖其他服务(比如数据库、网络服务),可在[Unit]段添加After=xxx.service,确保依赖服务启动完成后再执行你的预处理脚本。

内容的提问来源于stack exchange,提问作者Razikus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:54:20