
Fail2Ban:轻量级日志封禁工具
Fail2Ban 的原理很直接:监控日志文件,用正则匹配失败记录,达到阈值后调用防火墙封禁 IP。它轻量、配置简单,非常适合用来保护 SSH。 安装(Ubuntu/Debian)
环境:Kali GNU/Linux Rolling 2026.3,zsh 5.9 / bash 5.3.9,root 与普通用户都要生效。一句话结论:
㉿不是主机名,是 Kali 提示符的分隔符变量prompt_symbol;把它的赋值改成💀即可,不用动/etc/hostname。
Kali 登录后长这样:
┌──(root㉿kali)-[~]
└─#
很多人第一反应是「主机名怎么是 root㉿kali」,于是去改 /etc/hostname——改错了。这样改的话,/etc/hosts、sudo、各种依赖主机名的服务都可能跟着出问题,而且提示符也不会变成你要的样子(你只是把 kali 换成了另一个词)。
真实结构是 用户名 + 分隔符 + 主机名,Kali 在 ~/.zshrc / ~/.bashrc 里拼出来的:
# ~/.zshrc 中的默认 PROMPT(简写)
PROMPT=$'...(%B%F{%(#.red.blue)}%n'"$prompt_symbol"'%m%b%F{...})-[%~]...'
# ↑用户名 ↑分隔符 ↑主机名
对应关系:
| 提示符片段 | 变量 | 值 |
| ---------- | ---------------- | ------------------------- |
| root | %n | 当前用户名 |
| ㉿ | $prompt_symbol | 要改的就是它 |
| kali | %m | 主机名(/etc/hostname) |
验证一下当前值:
grep -n prompt_symbol ~/.zshrc ~/.bashrc
# ~/.zshrc:95: prompt_symbol=㉿
# ~/.bashrc:72: prompt_symbol=㉿
Kali 的 shell 初始化里其实预留了一个「root 用骷髅」的开关,只是默认注释掉了:
# ~/.zshrc(configure_prompt 函数内)
prompt_symbol=㉿
# Skull emoji for root terminal
#[ "$EUID" -eq 0 ] && prompt_symbol=💀
取消那一行注释即可:
sed -i 's/^ #\[ "\$EUID" -eq 0 \] && prompt_symbol=💀/ [ "$EUID" -eq 0 ] \&\& prompt_symbol=💀/' ~/.zshrc
效果:root → root💀wolf,普通用户仍是 user㉿wolf。
直接把默认值改掉,那行 root 判断留着也无所谓(已经是同一个值):
prompt_symbol=💀
效果:root 和普通用户统一 ┌──(user💀host)-[~]。
prompt_symbol=💀 && PROMPT="${PROMPT//㉿/💀}" # 当前 shell 立即生效,退出即还原
这是个容易漏的地方。prompt_symbol 是每个用户自己家目录里的 rc 文件里写的,改 /root/.zshrc 只影响 root;新建用户又是从 /etc/skel 拷的模板。所以「全员 + 未来用户」要改:
| 文件 | 影响范围 |
| --------------------------------------- | -------------------------------- |
| /root/.zshrc、/root/.bashrc | root 用 zsh / bash |
| /etc/skel/.zshrc、/etc/skel/.bashrc | 以后adduser新建的用户 |
| /home/<已有用户>/.zshrc、.bashrc | 已存在的普通用户(本次是wolf) |
脚本化改法(带备份,幂等):
# 保存为 /tmp/patch_prompt.py,远程/本地都能跑
import os, shutil, time
ts = time.strftime("%Y%m%d%H%M")
targets = ["/root/.zshrc", "/root/.bashrc",
"/etc/skel/.zshrc", "/etc/skel/.bashrc",
"/home/wolf/.zshrc", "/home/wolf/.bashrc"]
for path in targets:
if not os.path.exists(path):
continue
s = open(path, encoding="utf-8").read()
if "prompt_symbol=\U0001F480 # unconditional" in s: # 幂等:改过就跳过
print("already", path); continue
shutil.copy2(path, path + ".bak-" + ts)
s = s.replace(" prompt_symbol=\u327f", # ㉿
" prompt_symbol=\U0001F480 # unconditional", 1) # 💀
s = s.replace(' #[ "$EUID" -eq 0 ] && prompt_symbol=\U0001F480',
' # [ "$EUID" -eq 0 ] && prompt_symbol=\U0001F480 # now unconditional', 1)
s = s.replace(" #prompt_symbol=\U0001F480",
" #prompt_symbol=\U0001F480 # now unconditional", 1)
open(path, "w", encoding="utf-8").write(s)
print("patched", path)
执行:
sudo python3 /tmp/patch_prompt.py
用
open(path,"w")原地截断写,文件属主/权限保持不变(/home/wolf/.zshrc仍是wolf:wolf);如果用mv覆盖就会变成 root 所有,普通用户再source可能踩权限坑。
文件里写对了不代表提示符对了——% 转义、颜色、emoji 宽度都可能让实际显示不一样。直接让 shell 把 PROMPT 展开打印出来:
# zsh(TERM 不设会走无颜色分支,看到的就不是真实提示符)
TERM=xterm-256color zsh -i -c 'print -rP "$PROMPT"' | cat -v
# bash
TERM=xterm-256color bash -i -c 'echo $PS1' | cat -v
cat -v 把不可见字符转义出来,💀(UTF-8 F0 9F 92 80)会显示成:
M-bM-^_M-^RM-^@
看到这段就说明序列里真的是骷髅,而不是「看着像」的其它字符。root 与普通用户各验一遍:
TERM=xterm-256color zsh -i -c 'print -rP "$PROMPT"' # root
su - wolf -c 'TERM=xterm-256color zsh -i -c "print -rP \"\$PROMPT\""' # 普通用户
PROMPT 是登录时算好的),新开一个 SSH 会话即可;急着看就 source ~/.zshrc。/etc/hostname。㉿ 是提示符装饰,主机名是独立概念;改主机名要连带 /etc/hosts、云厂商元数据/证书等,风险和收益完全不成正比。sudo 与 root 的判断。方案 A 依赖 $EUID -eq 0,sudo -s 进去也是 0,行为一致;如果你用 sudo bash 起子 shell,注意 rc 文件里对 root 的配色分支是另一段逻辑。ssh host '... python3 - <<PY ... PY' 这种嵌套 heredoc 会被远端 zsh 解析成 parse error near '()'。正确姿势:本地写好脚本 → scp 过去 → ssh host 'python3 /tmp/x.py'。zsh-syntax-highlighting 一般能正确计算;如果错位,换 Nerd Font 或终端设置里开 emoji 宽字符支持。.bak-时间戳,Kali 升级 kali-defaults 包时也可能覆盖这些文件。ls -l ~/.zshrc.bak-* # 找到备份
cp ~/.zshrc.bak-202610301033 ~/.zshrc && exec zsh
或者只把那一行改回去:
sed -i 's/prompt_symbol=💀.*/prompt_symbol=㉿/' ~/.zshrc ~/.bashrc
评论 0