Linux命令-nologin(用于系统账户或需要禁止交互式登录的场景)

发布时间:2026/6/4 6:24:38
Linux命令-nologin(用于系统账户或需要禁止交互式登录的场景)
nologin是 Linux 系统中用于限制用户登录的特殊命令和 shell。它通常用于系统账户或需要禁止交互式登录的场景。 基本概念作为命令/usr/sbin/nologin直接执行时会显示提示信息并拒绝登录作为 shell/sbin/nologin或/usr/sbin/nologin在/etc/passwd中指定为用户 shell 主要用途系统账户安全防止系统服务账户被用于交互式登录用户账户锁定临时或永久禁止用户登录系统服务账户管理为应用程序创建专用但无法登录的账户 核心用法1. 直接使用 nologin 命令# 直接运行会显示提示信息并退出/usr/sbin/nologin# 查看退出状态码echo$?# 通常返回 12. 在 /etc/passwd 中配置用户 shell# 查看当前用户的 shellecho$SHELL# 查看 /etc/passwd 中的 shell 配置cat/etc/passwd|grepnologin# 典型配置示例在 /etc/passwd 中# daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin# www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin3. 修改用户 shell 为 nologin# 使用 usermod 命令修改现有用户sudousermod-s/usr/sbin/nologin username# 使用 chsh 命令修改当前用户的 shell需要密码chsh-s/usr/sbin/nologin# 创建新用户时指定 nologin shellsudouseradd-s/usr/sbin/nologin-M-rserviceuser# 验证修改grepusername /etc/passwd4. 恢复用户登录权限# 恢复为 bash shellsudousermod-s/bin/bash username# 恢复为 sh shellsudousermod-s/bin/sh username# 恢复为默认 shell在 /etc/default/useradd 中定义sudousermod-s/bin/bash username 自定义 nologin 提示信息1. 创建自定义提示文件# 创建提示文件通常位于 /etc/nologin.txt 或 /etc/issue.netsudonano/etc/nologin.txt示例内容 账户访问被拒绝 此账户已被系统管理员禁用。 如需恢复访问权限请联系 IT 支持部门。 联系电话: 123-456-7890 邮箱: supportexample.com 拒绝时间: $(date) 2. 配置 nologin 使用自定义消息# 方法1使用 -f 选项指定文件如果 nologin 支持/usr/sbin/nologin-f/etc/nologin.txt# 方法2修改 nologin 源码重新编译高级用法# 或者使用自定义脚本替代3. 使用自定义 shell 脚本# 创建自定义拒绝登录脚本sudonano/usr/local/bin/mynologin#!/bin/bash# 自定义拒绝登录脚本catEOF ╔═══════════════════════════════════════╗ ║ 账户访问已被禁止 ║ ╠═══════════════════════════════════════╣ ║ 原因此账户仅用于系统服务 ║ ║ 禁止交互式登录 ║ ║ ║ ║ 如需帮助请联系系统管理员 ║ ║ 邮箱admincompany.com ║ ║ 电话分机 1001 ║ ╚═══════════════════════════════════════╝ EOF# 记录登录尝试echo$(date): 用户$USER尝试登录 (来自$SSH_CLIENT)/var/log/nologin_attempts.logexit1# 设置执行权限sudochmodx /usr/local/bin/mynologin# 应用到用户sudousermod-s/usr/local/bin/mynologin username nologin 与 /bin/false 的区别特性/usr/sbin/nologin/bin/false提示信息显示拒绝登录消息无任何输出交互性显示消息后退出立即静默退出日志记录可自定义消息和日志无日志功能用户友好较友好可说明原因不友好直接拒绝退出码通常为 10典型用途系统服务账户完全禁止任何交互 查看系统中的应用1. 查找使用 nologin 的用户# 查找所有使用 nologin 的用户grepnologin /etc/passwd# 统计数量grep-cnologin /etc/passwd# 显示详细信息grepnologin /etc/passwd|cut-d: -f1,6,7|column-t-s:2. 查看系统账户配置# 常见的系统账户使用 nologingrep-E(daemon|bin|sys|sync|games|man|lp|mail|news|uucp)/etc/passwd# 查看服务账户grep-E(www-data|mysql|postgres|redis|nginx|apache)/etc/passwd⚡ 实际应用场景场景 1安全锁定用户账户#!/bin/bash# 安全锁定用户账户脚本USERNAME$1REASON$2ADMIN_EMAILadminexample.comif[[-z$USERNAME]];thenecho用法:$0用户名 [原因]exit1fi# 检查用户是否存在if!id$USERNAME/dev/null;thenecho错误: 用户$USERNAME不存在exit1fi# 创建自定义提示消息cat/tmp/nologin_$USERNAME.txtEOF 账户已被锁定 用户名:$USERNAME锁定时间:$(date)锁定原因:${REASON:-违反安全策略}如需解锁请联系系统管理员: 邮箱:$ADMIN_EMAIL电话: 400-123-4567 EOF# 移动提示文件到安全位置sudomv/tmp/nologin_$USERNAME.txt /etc/nologin_$USERNAME.txtsudochmod644/etc/nologin_$USERNAME.txt# 锁定用户账户echo正在锁定用户账户:$USERNAMEsudousermod-s/usr/sbin/nologin$USERNAME# 可选同时锁定密码sudopasswd-l$USERNAME# 记录操作日志echo$(date): 用户$USERNAME被锁定原因: ${REASON:-未指定}|sudotee-a/var/log/user_lock.logecho用户$USERNAME已被成功锁定echo提示信息保存在: /etc/nologin_$USERNAME.txt场景 2批量创建服务账户#!/bin/bash# 批量创建服务账户使用 nologin shell# 服务账户列表SERVICES(app1:1001:/opt/app1app2:1002:/opt/app2dbbackup:1003:/backupmonitor:1004:/var/monitor)echo开始创建服务账户...echoforservicein${SERVICES[]};do# 解析配置IFS:read-rusername uid homedir$serviceecho创建账户:$username# 创建用户组sudogroupadd-f$username# 创建用户无登录权限sudouseradd\-r\-s/usr/sbin/nologin\-d$homedir\-g$username\-u$uid\-cService account for$username\$username# 创建家目录并设置权限sudomkdir-p$homedirsudochown$username:$username$homedirsudochmod750$homedir# 创建自定义 nologin 消息sudotee$homedir/.nologin.txt/dev/nullEOF 此账户 ($username) 是系统服务账户。 禁止交互式登录。 如需管理此服务请使用: sudo systemctl status${username}sudo journalctl -u${username}服务器:$(hostname)创建时间:$(date)EOFecho - UID:$uidecho - 家目录:$homedirecho - Shell:$(grep^$username:/etc/passwd|cut-d:-f7)echo---doneecho服务账户创建完成echo使用以下命令验证:echogrep -E $(echo${SERVICES[]}|tr \n|cut-d:-f1|tr\n|) /etc/passwd场景 3检查系统安全配置#!/bin/bash# 检查系统账户安全配置echo 系统账户安全检查 echo检查时间:$(date)echo# 1. 检查使用登录 shell 的系统账户echo1. 使用登录 shell 的系统账户:echo----------------------------------------grep-E^(root|bin|daemon|adm|lp|sync|shutdown|halt|mail|news|uucp|operator|games|gopher|ftp|nobody|systemd-|dbus|polkitd|abrt|rtkit|saslauth|postfix|chrony|sshd):/etc/passwd|\grep-vnologin|\grep-vfalse|\whileIFS:read-ruser pass uid gid desc home shell;doif[[$shell!/usr/sbin/nologin$shell!/bin/false]];thenprintf%-15s %-10s %s\n$userUID:$uid$shellfidoneecho# 2. 检查空密码账户echo2. 空密码或弱密码账户:echo----------------------------------------sudoawk-F:($2 || $2 !) {print $1}/etc/shadowecho# 3. 检查 UID 0 的账户除了 rootecho3. UID 为 0 的非 root 账户:echo----------------------------------------awk-F:($3 0 $1 ! root) {print $1}/etc/passwdecho# 4. 检查最近登录的用户echo4. 最近登录的用户:echo----------------------------------------last-n10|head-10echo# 5. 建议操作echo 安全建议 echo1. 将不需要登录的系统账户 shell 改为 /usr/sbin/nologinecho2. 定期检查 /etc/passwd 和 /etc/shadow 文件权限echo3. 禁用不必要的系统账户echo4. 监控登录失败尝试⚠️ 重要注意事项1. 系统账户管理# 不应修改的系统账户通常已配置为 nologin# daemon, bin, sys, adm, lp, mail, news, uucp, etc.# 检查哪些系统账户仍使用登录 shellgrep-E^[^:]:[^:]*:[0-9]{1,3}:/etc/passwd|\awk-F:$3 1000 $7 !~ /(nologin|false)/ {print $1 - $7}2. SSH 相关配置# 即使使用 nologin用户仍可能通过其他方式访问# 确保 SSH 配置正确# 检查 SSH 配置sudogrep-E^(AllowUsers|DenyUsers|AllowGroups|DenyGroups)/etc/ssh/sshd_config# 完全禁止用户 SSH 登录在 nologin 基础上echoDenyUsers username1 username2|sudotee-a/etc/ssh/sshd_configsudosystemctl restart sshd3. 权限控制# 即使使用 nologin用户仍可能通过其他方式执行命令# 确保文件权限正确# 检查用户的 crontabsudocrontab-uusername-l# 检查用户的 at 任务sudoatq# 检查用户的 sudo 权限sudogrepusername/etc/sudoers /etc/sudoers.d/* 相关命令对比命令/Shell用途特点/usr/sbin/nologin拒绝登录并显示消息用户友好可自定义消息/bin/false立即退出无输出静默拒绝退出码为 0/bin/true立即成功退出用于测试退出码为 0passwd -l锁定用户密码用户无法使用密码登录usermod -L锁定用户账户同passwd -lchsh -s更改用户 shell修改登录 shell 最佳实践系统账户所有系统服务账户都应使用nologin或falseshell自定义消息为服务账户提供有用的提示信息定期审计定期检查/etc/passwd中的 shell 配置最小权限配合适当的文件权限和 sudo 配置监控日志监控登录尝试特别是被拒绝的登录备份配置修改前备份/etc/passwd和/etc/shadownologin是 Linux 系统安全的重要工具合理使用可以有效降低系统安全风险同时为系统管理提供清晰的账户管理策略。