ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu 修改主机名、用户名和密码全流程与避坑

Ubuntu 修改主机名、用户名和密码全流程与避坑 1. 先弄清楚主机名、用户名、密码这三样东西分别归谁管在 Ubuntu 上折腾主机名、用户名和密码最容易翻车的地方不是命令记不住而是搞不清这三样东西各自存在哪里、谁在读写、谁会在重启后把它覆盖回去。我见过太多人敲完hostnamectl set-hostname之后重启发现名字又变回原来的ubuntu然后一脸茫然地来问是不是命令失效了。其实命令没失效是有另一个进程在启动的早期阶段把值重新写了一遍。先用一句话建立直觉主机名是这台机器在网络里的门牌号用户名是你在系统内部的身份证密码则是验证这张身份证的凭据。门牌号可以随便换但换了以后得通知物业/etc/hosts和邮局DNS否则别人按新门牌号找不到你按老门牌号也没人应答。身份证换起来就麻烦得多因为系统里到处都留下了旧身份证号的复印件——家目录、邮件目录、计划任务、定时器、各种服务的配置文件全都可能硬编码了那个旧名字。密码相对独立它是挂在用户名下面的一条加密记录改密码基本不会牵连其他东西但如果连用户名一起改密码那条记录也得跟着搬家。1.1 三个关键文件看懂它们就成功了一半Linux 把用户信息拆成两个文件存放这个设计是历史遗留但非常有用/etc/passwd存放的是公开信息包括用户名、UID、GID、家目录路径、登录 shell这个文件历史上是真放密码的所以现在叫这个名字但实际是明文的/etc/shadow存放真正的密码哈希只有 root 能读普通用户cat会直接被拒绝。$ ls -l /etc/passwd /etc/shadow /etc/group -rw-r--r-- 1 root root 2891 ... /etc/passwd -rw-r----- 1 root shadow 1494 ... /etc/shadow -rw-r--r-- 1 root root 1053 ... /etc/group注意/etc/shadow的属主是root:shadow、权限是640这个细节很重要——后面重置密码报Authentication token manipulation error的时候八成就是权限或者磁盘空间出了问题。主机名则放在/etc/hostname这个单行文件里同时在/etc/hosts里通常会有一条127.0.1.1的映射这两处必须同步只改一处就是给自己埋雷。提示动手前先备份sudo cp -a /etc/{passwd,shadow,group,gshadow,hostname,hosts} /root/backup_$(date %F)/这条命令花不了三秒但能救你一次重装系统的时间。1.2 为什么改用户名比改主机名难十倍主机名本质上只是一个字符串变量系统里引用它的地方有限而且大多是运行时读取的。用户名不一样它是文件系统的所有权标识——你家目录下每一个文件的属主字段里都存着 UID 和组 ID各种配置文件里到处散落着旧的用户名字符串。更麻烦的是Ubuntu 允许你只改名字不改 UIDusermod -l就是这么干的这看起来很方便实际上会留下一个隐患如果你之前用旧用户名创建过文件、配过服务这些地方记录的字符串还是旧的。反过来如果你改了 UID那所有旧文件就都变成了孤儿文件属主显示成一串数字反而更乱。所以我的经验是改用户名时只改名字坚决不动 UID 和 GID然后手动去清理那些残留的字符串引用这样最稳。记住一个判断标准如果某个配置里写的是用户名你需要手动改如果写的是UID 数字那不用管。想快速定位哪些地方写着旧用户名后面第 3 章会给一条实测好用的搜索命令。2. 修改主机名临时改法和永久生效的完整路径主机名这块的坑主要集中在改了不持久和改了之后 sudo 变慢这两类。前者通常是 cloud-init 或者 DHCP 客户端在捣鬼后者则几乎百分百是/etc/hosts没同步。这一章我把从临时改到永久改的完整链路过一遍。2.1 临时改与永久改的区别一张表说清先说结论hostname命令改的是运行时值重启即失效hostnamectl set-hostname改的是持久化配置重启保留。在 systemd 系统上hostname newname实际上等价于hostnamectl set-hostname --transient newname它只改内核里那个瞬态主机名不碰/etc/hostname。操作方式作用范围重启后适用场景sudo hostname newname仅内核瞬态值丢失临时测试、脚本里临时切换sudo hostnamectl set-hostname newname静态配置 瞬态保留正式改名推荐方式手改/etc/hostname仅静态配置文件保留系统起不来时的救援手段手改/etc/hosts本地名称解析保留必须同步做的配套动作现代 systemd 把主机名分成三层这个设计初看多余用久了会发现很合理static静态主机名存在/etc/hostname由管理员设定、transient瞬态主机名内核维护可被 DHCP 客户端或hostname命令临时覆盖、pretty美化名允许空格、中文等任意 UTF-8 字符纯展示用不参与任何网络解析。# 查看当前三层主机名的完整状态 hostnamectl status # 只设置静态名最常用 sudo hostnamectl set-hostname dev-box # 顺便设置一个好看的美化名仅桌面环境展示用 sudo hostnamectl set-hostname Dev Box 01 --pretty我个人的习惯是服务器只设静态名名字用纯小写字母加连字符比如web-prod-01、db-stage-02完全不用下划线和大写——因为主机名最终会参与 DNS 解析而 DNS 对大小写不敏感但很多工具处理下划线会出问题尤其是主机名出现在 TLS 证书的 CN 字段里的时候。2.2 /etc/hosts 里那条 127.0.1.1 到底要不要改Ubuntu 和 Debian 系默认会在/etc/hosts里放这么两行127.0.0.1 localhost 127.0.1.1 old-hostname第二行是 Debian 系特有的设计。因为很多程序启动时会调用gethostname()拿到本机名然后立刻反向解析这个名字想拿到 IP如果/etc/hosts里没有对应记录就得去问 DNS 服务器而这个查询往往要等超时默认 5 秒起步表现出来就是sudo卡半天、hostname -f卡半天。所以改完主机名后必须把/etc/hosts里127.0.1.1后面那个名字一起改掉sudo sed -i s/127.0.1.1.*/127.0.1.1\tdev-box/ /etc/hosts cat /etc/hosts这一步做完用hostname -f验证一下如果秒返回完整限定域名FQDN说明解析链路通了。如果还是卡检查/etc/nsswitch.conf里hosts:那一行的顺序Ubuntu 默认是files mdns4_minimal [NOTFOUNDreturn] dns这个顺序是对的先查本地文件再查 DNS。2.3 谁在偷偷把你的主机名改回去这是最让人抓狂的一类问题命令敲了、文件也改了、当前会话里看着没问题一重启就回到解放前。三个常见元凶第一个是 cloud-init。云主机镜像和某些虚拟机镜像会在启动早期执行 cloud-init它默认会从元数据服务或者 DHCP 响应里读取主机名并覆盖本地设置。解决办法是在配置目录里加一个片段明确告诉它别管sudo tee /etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg EOF preserve_hostname: true EOF也可以直接改主配置/etc/cloud/cloud.cfg里的preserve_hostname字段但我更推荐用cloud.cfg.d/下的独立片段因为主配置文件在包升级时可能被覆盖或合并独立片段更安全。写完可以用cloud-init query --format {{ds.meta_data}}之类的命令确认一下元数据来源不过说实话加完 preserve_hostname 基本就够了。第二个是 DHCP 客户端。如果你的机器是通过 DHCP 拿地址的dhclient 在续约时可能把 server 下发的主机名写进来。Netplan 环境下可以在网卡配置里显式关掉network: version: 2 ethernets: ens33: dhcp4: true dhcp4-overrides: hostname: dev-box use-hostname: false改完执行sudo netplan apply。注意 YAML 对缩进极其敏感务必用空格不用 Tab缩进错了netplan apply会直接报解析错误不会静默失败这点还算友好。第三个是容器和 WSL 环境。WSL2 里的 Ubuntu 主机名默认跟 Windows 主机名走在 WSL 里改/etc/hostname会被 WSL 启动流程重置。要固定下来需要在 Windows 侧的配置文件里设置或者在~/.bashrc或/etc/wsl.conf里处理。WSL 的/etc/wsl.conf里写[network] hostname dev-box generateHosts false改完需要在 Windows 命令行执行一次wsl --shutdown让整个发行版重启才生效光重启 bash 没用。2.4 改完主机名后的三步验证清单改主机名这件事动作只有两个验证却必须做全我给自己定的清单是三步# 第一步三个层面看名字是否一致 hostname # 瞬态值 hostnamectl --static # 静态值 cat /etc/hostname # 文件内容 # 第二步看名称解析是否顺畅这条卡不卡最能说明问题 time hostname -f hostname -I # 看机器识别到的 IP 列表 # 第三步看 sudo 和 ssh 是否正常 sudo -k sudo echo ok ssh dev-box echo connected第三步里的ssh dev-box需要你在~/.ssh/config里配过 Host 别名或者 DNS/hosts 里能解析这个名字。这一步能过说明从网络层到认证层整条链路都没问题。我见过一次改了主机名之后 SSH 免密登录失效的案例排查半天发现是~/.ssh/config里写死了HostName 192.168.1.10跟主机名根本没关系——所以遇到改主机名导致 SSH 挂了这种描述先别急着怀疑主机名看看配置里是不是硬编码了 IP。3. 修改用户名四个阶段、十几处残留顺序错一步就登不进系统这是我做过的操作里最容易把人锁在门外的。核心原因在于你打算改的那个用户很可能就是你自己当前登录的账号。系统不允许你修改一个正在被使用的用户而且改完之后如果你没有别的可用账号就只能进恢复模式救场了。3.1 先把操作顺序理清楚再动手完整流程我总结成四步顺序不能乱准备一个后备账号或者直接开一个 root shell。这一步是安全绳千万别省。踢掉目标用户的所有活跃进程和会话包括 SSH 连接、screen/tmux、systemd 用户服务。改登录名 → 改组名 → 改家目录 → 改备注这四件事用usermod和groupmod完成。扫一遍残留引用把服务配置、计划任务、邮件目录里的旧名字清掉。为什么第 2 步不能跳因为usermod -l在目标用户还有进程运行的时候会报user zhang is currently used by process 1234强行加-f参数虽然能绕过检查但风险是家目录里的文件正在被写入改名过程中可能产生权限混乱甚至数据损坏。老老实实把进程清干净再改多花十秒钟省掉一小时排查。# 确认目标用户的进程和会话 ps -u zhang -o pid,cmd loginctl list-sessions who # 优雅地结束该用户的所有会话 sudo loginctl terminate-user zhang # 如果还有漏网进程强制清掉 sudo pkill -TERM -u zhang sleep 2 sudo pkill -KILL -u zhang3.2 usermod 每个参数背后的考量usermod参数不少但改用户名这件事上真正用得着的就四个# 假设备份账号是 admin目标用户原名 zhang想改成 wang sudo usermod -l wang zhang # 只改登录名UID 不动 sudo groupmod -n wang zhang # 如果存在同名用户组组名也要改 sudo usermod -d /home/wang -m wang # 改家目录路径并迁移内容 sudo usermod -c Wang San wang # 改 GECOS 备注字段可选逐个说讲究-l只改登录名。它修改/etc/passwd第一列和/etc/shadow对应的条目UID 保持不变。UID 不动的好处是文件属主全部自动跟随新名字显示因为文件系统里存的是 UID 不是用户名ls -l只是拿 UID 去/etc/passwd查名字。这是整个操作最关键的一点理解——用户名只是个标签UID 才是身份。-m必须和-d一起用。usermod -d /home/wang单独执行只改配置文件里的路径不会真的移动目录结果就是用户登录后找不到家目录被塞到/目录下~展开成/.bashrc读不到提示符变成$而不是userhost:~$。加上-m才会把旧目录内容搬到新目录。如果你的家目录特别大比如里面塞了几十 G 的虚拟机镜像-m会变成一次完整的文件搬运耗时长还可能因为空间不足失败。这种情况我建议先手动mv再改配置sudo mv /home/zhang /home/wang sudo usermod -d /home/wang wang手动 mv 是元数据操作同一分区内瞬间完成比复制快得多。groupmod -n改的是用户组名。Ubuntu 默认在创建用户时会同时创建一个同名用户组useradd的USERGROUPS_ENAB机制所以改用户名时通常也要改组名。但如果你这个用户的主组不是同名组比如你手动指定过-g developers那就别执行这条改了反而乱。先查一下id zhang # 输出类似 uid1001(zhang) gid1001(zhang) groups1001(zhang),27(sudo) # 这里 gid 对应的组名和用户名相同需要一起改-c改的是 GECOS 字段就是图形登录界面和finger命令显示的全名。这个字段允许中文和空格但我的建议是别用中文——某些老旧工具读取 GECOS 时按逗号分割中文全名配合多字节编码偶尔会出现截断问题而且远程登录横幅里显示中文全名在某些终端下会乱码。用拼音或英文全名最稳。3.3 家目录和权限改完名字一定要复查的两个点改完之后立刻做这两件事# 第一件确认属主和属组都指向新名字 ls -ld /home/wang # 期望输出drwxr-x--- 5 wang wang 4096 ... /home/wang # 第二件递归修正家目录内所有文件的所有权 sudo chown -R wang:wang /home/wang第二条看着多余其实很有必要。虽然理论上 UID 没变所以文件属主不会错但如果你的家目录里混进了其他用户创建的文件比如 root 用sudo操作过某些目录或者之前用chown -R留下过不一致的状态这一步能一次性理顺。还有两个容易被忽略的目录邮件目录/var/mail/zhang和回收站/home/wang/.local/share/Trash。邮件目录要手动改sudo mv /var/mail/zhang /var/mail/wang sudo chown wang:mail /var/mail/wang改完杂项之后检查一下/etc/passwd里这个用户的 shell 字段是不是有效路径。有次我改完用户名发现登录后是个极简 shell只有$提示符折腾半天才发现/etc/passwd最后一列变成了/bin/bash但/bin是/usr/bin的软链所有看着没问题实际是/etc/shells里没有这个路径导致 PAM 拒绝正常 shell——这种坑属于撞上了才知道。3.4 那些散落在系统里的旧用户名引用这是整个改用户名过程中最耗时的部分也是最需要经验的部分。用一条命令扫一遍sudo grep -rIl zhang /etc /var/spool /opt /srv /usr/local 2/dev/null-I参数很重要它跳过二进制文件避免把一堆乱码打印到终端也避免误改二进制配置。扫出结果后逐个判断下面是我总结的常见命中点清单位置是否需要改处理方式/etc/passwd/etc/group/etc/shadowusermod 已自动处理用 grep 复查确认无残留/etc/sudoers及/etc/sudoers.d/*视写法而定用%sudo组的一般不用改写了具体用户名的要改必须用visudo/etc/cron.d/*需要文件第六列是执行用户改成新名字/var/spool/cron/crontabs/zhang需要文件名改名并用chown wang:crontab修正/etc/systemd/system/*.service需要User和Group两个字段/etc/security/opasswd需要密码历史记录按用户名索引不处理会导致新密码校验异常/etc/subuid/etc/subgid需要容器相关的 UID 映射范围/etc/aliases视情况邮件别名改完跑sudo newaliases/etc/exports/etc/samba/*视情况网络共享配置里常硬编码用户名/opt/**下的应用配置看应用数据库连接串、Tomcat 的 setenv.sh 等/usr/local/bin/*.sh自定义脚本看脚本脚本里su - zhang这种写法会失效改 systemd 服务的时候别忘了sudo systemctl daemon-reload不然改了文件不重载服务重启还是用旧配置。改完之后顺手systemctl status 服务名看一眼有没有Userzhang找不到的报错。另外提一个容易忽略的SSH 公钥末尾的注释。~/.ssh/id_rsa.pub最后一列通常是zhangold-hostname这只是个注释改不改都不影响认证但为了干净可以手动改掉。真正影响认证的是~/.ssh/authorized_keys里的内容那个和目标用户名无关不用担心。最后如果你在用 Git别忘了sudo -u wang git config --global user.name wang sudo -u wang git config --global user.email wangexample.com sudo -u wang git config --global --list用sudo -u而不是su后执行能保证改的是正确用户的家目录下的.gitconfig。直接su - wang然后改也行但要注意环境变量继承的问题。4. 修改密码常规操作、策略配置和忘记密码的救援路径密码这一块日常操作很简单麻烦的是策略配置和救援场景。先说最简单的用法再讲策略最后讲忘了密码怎么救。4.1 passwd 的几种用法和它改了什么passwd # 改自己的密码需要先输旧密码 sudo passwd wang # 管理员改别人的密码不需要旧密码 echo wang:NewPass123 | sudo chpasswd # 非交互式批量场景用慎用 sudo passwd -S wang # 查看状态是否设置、是否锁定、最后修改日期 sudo passwd -l wang # 锁定账号在哈希前加 ! 号 sudo passwd -u wang # 解锁 sudo passwd -e wang # 强制下次登录必须改密 sudo passwd -d wang # 清空密码等于允许空密码登录生产环境绝对别用passwd背后做的事其实很简单读取新密码用 PAM 配置的算法现代 Ubuntu 默认是 yescrypt算出哈希写进/etc/shadow。所以如果报错Authentication token manipulation error八成是/etc/shadow不可写或者磁盘满了检查这两个方向就行。passwd -l加的那个!号很巧妙——它是在密码哈希前面插一个感叹号导致任何输入的密码算出的哈希都不可能等于这个值从而实现锁定而且不影响以后解锁恢复。理解这一点你在看/etc/shadow看到!开头的哈希时就明白是锁定了而不是密码坏了。echo user:pass | chpasswd这种写法在批量初始化脚本里很常见但有两个明显问题一是密码明文出现在命令历史里虽然管道里的内容不进 history但脚本文件本身可能被读二是密码明文出现在进程列表里。如果非要自动化用chpasswd -e配合已经算好的哈希或者用 Ansible 的user模块配password参数它接受哈希安全性好得多。4.2 密码有效期和复杂度策略Ubuntu 里有三个地方控制密码策略作用范围不同/etc/login.defs控制的是useradd、chage这类命令的默认值对已经存在的用户不生效只对新用户生效。关键字段PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_WARN_AGE 7默认 99999 天基本等于永不过期这是 Ubuntu 桌面版的默认值服务器上通常会收紧。chage命令针对单个已有用户设置这是实际操作中最常用的chage -l wang # 查看当前策略 sudo chage -M 90 -m 7 -W 14 -I 30 -E 2026-12-31 wang参数含义-M 90密码最长用 90 天-m 7改完至少 7 天才能再改防止用户改一圈绕回旧密码-W 14过期前 14 天开始提醒-I 30过期后 30 天内还能登录会被强制改密超过就彻底锁死-E设置账号本身的失效日期。这五个参数配齐基本就是一套标准的企业合规策略。PAM 的 pwquality 模块管的是密码复杂度也就是设密码时允不允许你设123456。配置文件在/etc/security/pwquality.confUbuntu 上由/etc/pam.d/common-password里的pam_pwquality.so行调用# 在 /etc/pam.d/common-password 里 password requisite pam_pwquality.so retry3# 在 /etc/security/pwquality.conf 里 minlen 12 dcredit -1 ucredit -1 lcredit -1 ocredit -1 minclass 3这组配置的意思是最短 12 位且至少包含一个大写、一个小写、一个数字、一个特殊字符中的三类。retry3表示允许输错三次。注意改完common-password立刻生效不需要重启但当前已经登录的会话不会重新校验。测试的时候新开一个终端用passwd验证别用已经登录的会话试会得到误导性的结果。还有个细节pam_pwhistory模块负责记录历史密码数据存在/etc/security/opasswd。这个文件在改用户名的时候需要跟着改否则历史记录会跟用户名对不上可能表现为新密码设不了提示用过或者反过来老密码能重复使用。改用户名时检查一下这个文件是很有必要的。4.3 忘了 root 密码怎么办两条救援路径先说清楚前提以下操作针对你拥有物理或控制台访问权限的自己管理的机器云主机一般通过控制台的 VNC 或者挂载救援系统来做原理一致。远程 SSH 情况下没有办法做这一步这是设计使然。路径一GRUB 恢复模式推荐最省事重启在 BIOS 引导阶段按住Shift传统 BIOS或连按EscUEFI进入 GRUB 菜单。选择Advanced options for Ubuntu再选带(recovery mode)的内核条目。在恢复菜单里选root进入 Drop to root shell prompt。关键一步恢复模式下根文件系统默认是只读挂载的必须重挂mount -o remount,rw / passwd root # 或者 passwd 你的用户名如果提示密码太简单被拒绝可以先临时把 pwquality 那行注释掉改完再恢复。路径二编辑内核启动参数恢复模式进不去时的备选在 GRUB 菜单高亮启动项按e进入编辑。找到以linux开头的那一整行在末尾追加rw init/bin/bash按CtrlX或F10启动会直接进入一个没有服务、没有网络的裸 bash。因为已经加了rw通常不用再 remount但保险起见执行一次mount -o remount,rw /。passwd root改密码。收尾很重要sync exec /sbin/init或者直接reboot -f。如果只敲reboot可能会失败因为此时没有 systemd 在管进程。用reboot -f强制重启最省事。两个路径都可能遇到的拦路虎/etc/shadow被加了不可变属性。某些安全加固过的系统会执行chattr i /etc/shadow这时passwd会报权限错误。处理方式是chattr -i /etc/shadow passwd root chattr i /etc/shadow改完记得把属性加回去否则加固就白做了。另外如果根分区启用了全盘加密进恢复模式前还需要先输 LUKS 口令解锁这个口令跟系统登录密码是两回事忘了就只能靠恢复密钥或者重装。5. 一次完整实操记录把测试机从 ubuntu 改成 devops前面讲的都是分项这一章把一次完整的改造过程走一遍包括每一步的验证输出和遇到的问题。这台测试机是 VMware 里的 Ubuntu 22.04原始用户是ubuntu主机名也是ubuntu要改成用户devops、主机名dev-box。5.1 环境和前置准备先建立一个后备账号这一步是整个流程的安全绳sudo adduser rescue sudo usermod -aG sudo rescue id rescue # uid1001(rescue) gid1001(rescue) groups1001(rescue),27(sudo)验证这个账号能正常 sudosudo -u rescue sudo -k sudo -u rescue sudo echo rescue 有 sudo 权限注意这里sudo -u rescue sudo echo的写法前半段是切换到 rescue 身份后半段是以那个身份执行 sudo。sudo -k是先清掉缓存的时间戳强制重新验证密码不然可能因为当前会话的 sudo 缓存直接通过测不出真实情况。备份关键文件sudo mkdir -p /root/backup-$(date %F) sudo cp -a /etc/passwd /etc/shadow /etc/group /etc/gshadow \ /etc/hostname /etc/hosts /etc/sudoers \ /root/backup-$(date %F)/ ls -l /root/backup-*/5.2 完整命令序列和实际输出# 用 rescue 账号登录一个新会话不要用待改的 ubuntu 账号 ssh rescue192.168.56.10 # 切到 root避免后续每步都 sudo sudo -i # 清掉 ubuntu 用户的所有会话 loginctl list-sessions pkill -TERM -u ubuntu sleep 2 pkill -KILL -u ubuntu 2/dev/null # 改用户名 usermod -l devops ubuntu # 输出无成功时静默 # 改用户组名 groupmod -n devops ubuntu # 改家目录本地磁盘直接 mv 更快 mv /home/ubuntu /home/devops usermod -d /home/devops devops # 改备注 usermod -c DevOps Account devops改完立刻验证核心字段id devops # uid1000(devops) gid1000(devops) groups1000(devops),27(sudo) grep devops /etc/passwd /etc/group # /etc/passwd:devops:x:1000:1000:DevOps Account:/home/devops:/bin/bash # /etc/group:devops:x:1000: ls -ld /home/devops # drwxr-x--- 15 devops devops 4096 ... /home/devops注意 UID 还是 1000跟原来一致这说明家目录里所有文件的属主不用动。接着扫残留grep -rIl ubuntu /etc /var/spool /opt /usr/local 2/dev/null | head -50实际扫出这几类/etc/hosts127.0.1.1 那行、/etc/hostname、/etc/subuid、/etc/subgid、/etc/sudoers.d/90-cloud-init-users、/var/spool/cron/crontabs/ubuntu。逐个处理# subuid/subgid容器 UID 映射 sed -i s/^ubuntu:/devops:/ /etc/subuid /etc/subgid # sudoers 片段这个是 cloud-init 生成的 visudo -f /etc/sudoers.d/90-cloud-init-users # 把里面的 ubuntu ALL(ALL) NOPASSWD:ALL 改成 devops ALL(ALL) NOPASSWD:ALL # crontab 文件改名并修权限 mv /var/spool/cron/crontabs/ubuntu /var/spool/cron/crontabs/devops chown devops:crontab /var/spool/cron/crontabs/devops chmod 600 /var/spool/cron/crontabs/devops最后改主机名hostnamectl set-hostname dev-box sed -i s/127.0.1.1.*/127.0.1.1\tdev-box/ /etc/hosts # 加 cloud-init 保留配置防止重启被覆盖 cat /etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg EOF preserve_hostname: true EOF5.3 重启后的验证结果重启是最真实的测试所有缓存都清空reboot # 重启后重新登录 ssh devops192.168.56.10 whoami # devops hostname # dev-box hostname -f # dev-box秒返回不卡 sudo -k sudo echo ok # oksudo 正常 crontab -l # 旧任务还在说明 crontab 迁移成功这一步全过说明操作完整。整个流程从备份到验证大概 15 分钟其中一半时间花在扫描和判断残留上。如果你只是改主机名5 分钟够了只改密码1 分钟改用户名请预留 20 分钟以上尤其是第一次做。6. 常见问题和排查速查表这些坑我都替你踩过了这一章是纯经验输出。下面这张表是我这几年处理相关问题时积累的对照表出现频率从高到低排列。6.1 高频问题速查表现象根因解决方式sudo报unable to resolve host xxx/etc/hosts里的主机名没同步把127.0.1.1那行改成新主机名hostname -f卡住好几秒名称解析走了 DNS 超时检查/etc/hosts和/etc/nsswitch.conf改完用户名后无法 SSH 登录家目录权限或登录 shell 有问题检查/etc/passwd最后一列、ls -ld家目录权限提示符还是旧用户名当前会话的环境变量是登录时读的注销重新登录或exec bash --login图形界面登录框显示旧名字GDM/GNOME 的显示缓存注销重启或重启systemctl restart gdm3老用户名的计划任务消失了crontab 文件没有改名见 3.4 节的迁移步骤passwd报 Authentication token manipulation error/etc/shadow只读或磁盘满df -h查空间chattr -i /etc/shadow查属性重启后主机名变回去cloud-init 或 DHCP 覆盖加preserve_hostname: trueNetplan 关use-hostname新设的密码提示已使用过/etc/security/opasswd还挂着旧用户名同步改这个文件里的条目usermod报 user is currently used by process目标用户还有活跃进程先loginctl terminate-user再pkill -uWSL 里改主机名不生效WSL 启动流程覆盖/etc/hostname改/etc/wsl.conf后执行wsl --shutdown家目录变成/或找不到usermod -d没配-m或目录没实际移动手动mv后重新usermod -d6.2 几个文档里不会写的实操心得第一条修改前先id一下别凭印象。很多人以为自己的用户主组就是同名组实际不是。有些企业环境用 LDAP 或者 SSSD 做集中认证本地/etc/passwd里可能压根没有这个用户usermod直接会说不存在或者改不动。这种情况要改的是集中认证系统里的记录本地改无效。判断方法getent passwd 用户名能查出来但grep 用户名 /etc/passwd查不出来那就是外部源提供的本地别瞎折腾。第二条sudoers文件永远用visudo打开。直接vim /etc/sudoers一旦语法错了所有 sudo 权限立刻失效你可能连改回来的权限都没有了。visudo会在保存时做语法检查报错就拒绝保存。改/etc/sudoers.d/下的文件也是同理用visudo -f 文件名。第三条改用户名之前先确认自己有没有别的登录方式。我有一次在只有单个用户的测试机上直接开始改改到一半发现当前 SSH 会话要断开重连才能生效而重连后新用户名还没配 SSH 密钥旧密钥路径变了直接把自己锁在外面整整一个下午。从那以后我养成了习惯改任何涉及登录身份的东西之前先开一个后备账号或者提前在控制台开着 root shell 不关。第四条批量环境不要一台一台手工改。如果你有十台以上的机器要统一主机名规范手工改必然出错。用 cloud-init 的 user-data 或者 Ansible 的hostname模块批量下发最稳把preserve_hostname和主机名一起写进初始化配置机器首次启动就是对的。已经跑起来的机器用 Ansible 推送- hosts: all become: yes tasks: - name: 设置主机名 hostname: name: {{ inventory_hostname }} - name: 同步 hosts 文件 lineinfile: path: /etc/hosts regexp: ^127\.0\.1\.1 line: 127.0.1.1\t{{ inventory_hostname }}用inventory_hostname做变量主机名跟资产清单自动对齐这样永远不会出现清单里叫web-01而机器自己叫ubuntu的尴尬情况。第五条云主机的主机名和实例名是两回事。在云平台上控制台里显示的实例名是平台侧的标签跟操作系统里的主机名没有必然联系。很多人在控制台改了实例名SSH 上去hostname一看没变以为改失败。这两者要分别设置平台的做平台的系统的做系统的。6.3 中文用户名这个雷区能不踩就别踩热词里有个用户名是中文我单独拿出来说一下。Ubuntu技术上允许用户名包含中文因为底层用的是 UTF-8/etc/passwd里存的就是字节序列。但允许归允许实际用起来问题非常多家目录路径带中文很多编译工具链和构建脚本处理路径时会出问题尤其是那些从 Windows 移植过来、内部用 ANSI 编码的工具SSH 登录时终端编码不匹配会显示成乱码你连自己用户名叫什么都看不清一些老旧的应用软件在读取/etc/passwd时按字节切分中文占三字节会导致字段错位Git 提交时 user.name 里带中文虽然没问题但某些 CI 系统处理提交者信息时会出异常。更现实的问题是你在终端里敲中文用户名本身就很不方便还得切输入法。所以我的态度很明确用户名一律用英文全小写不要数字开头不要连字符连字符在 Username 里其实合法但在某些邮件系统和 LDAP 里有歧义能避则避。想要中文显示名去设置 GECOS 字段或者桌面环境里改显示名那个字段支持任意字符不影响任何底层逻辑。# 显示名随便写中文登录名保持英文 sudo usermod -c 张三 zhangsan这样图形登录界面显示张三终端里还是zhangsan两边都舒服。6.4 WSL 环境下这几个操作要格外小心WSL 里的 Ubuntu 跟独立安装的 Ubuntu 有几个关键差异做这三类修改时必须注意。第一WSL 默认用 Windows 主机名作为 Linux 主机名而且每次启动都会同步一次所以在 Linux 侧改完必须同步改/etc/wsl.conf第二WSL 的默认用户是通过/etc/wsl.conf里的[user]段指定的改用户名之后这个配置也要同步否则启动时找不到默认用户会掉进 root第三WSL 里/etc/hosts由 WSL 自动生成想手动管理需要把generateHosts设成false但关掉之后 Windows 侧的 hosts 文件就不再自动同步到 Linux 了这会影响你访问 Windows 上配的域名得权衡一下。# /etc/wsl.conf 的推荐写法 [user] default devops [network] hostname dev-box generateHosts true改完wsl --shutdown然后重新打开一个 WSL 终端验证。这里的顺序是先在 Linux 里把用户名和主机名改好再写这个配置文件最后才 shutdown 重启。反过来做的话配置文件指定的用户在系统里还不存在会直接掉进 root 或者报错。整个过程我最想强调的是两件事任何涉及用户身份的修改都要先给自己留一条后路以及改完之后不要只看当前终端一定要重启验证。当前终端里的看起来没问题完全没有说服力因为大量配置是登录时一次性读取然后缓存在环境变量里的只有重启才能暴露真实状态。至于密码记住一句话就够了——密码是最好改的也是唯一一个你忘了一定能通过物理接触找回来的东西前提是别把全盘加密的解锁口令也一起忘了。
返回列表