能否创建在用户交互前启动的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
相关产品推荐
相关产品推荐

