在 UNIX & Linux Stack Exchange 上的另一个答案中迈克尔·D·帕克写道,回应有人说这样做是“安全的”,即:
通常您不应该直接编辑 /etc/shadow 文件。
所以:
你为什么要绝不直接编辑/etc/shadow
文件?
答案1
有多种原因不直接编辑/etc/passwd
, /etc/shadow
, /etc/group
,/etc/gshadow
或/etc/sudoers
,而是使用vipw
,vigr
或visudo
:
- 如果出现语法错误,您可能无法再登录或成为 root。使用 viXXX 工具可以降低这种风险,因为该工具会在修改文件之前进行健全性检查。
- 如果同时编辑文件,则最后保存的人将覆盖先前编辑所做的更改。这包括管理员编辑文件以及由于用户调用 或更改有关其帐户的某些内容而被修改
passwd
的文件chsh
。chfn
如果使用适当的工具,它将防止并发修改。对于具有多个用户的系统来说,这主要是一个问题,如果您是唯一的用户,则问题较少。 - 在某些系统(大部分或仅 *BSD)上,
vipw
更新多个文件(例如/etc/passwd
和/etc/master.passwd
)。这不适用于 Linux。 vipw
自动创建备份(passwd-
、shadow-
、 ...),如果您意识到不小心删除了一行,这会很有用。仅当您在下次编辑之前意识到这一点时,它才有用,因此它不会取代版本控制和备份,但如果您很快意识到自己的错误,它会非常好。visudo
不这样做。
你能直接编辑文件。您只会承担额外的风险,而没有真正的优势。
答案2
基本上有两种看待这个问题的方法:
切勿在不使用规定工具的情况下编辑某些文件,因为您可能不知道自己在做什么,但这没关系,因为所述工具更了解并且始终可用。
更现实的是,您不妨在考虑时立即打破它,以便您可以提前计划备份副本并在完成后比较差异,因为有关系统基本初始
login
过程的来龙去脉的基本知识可能是值得的当你稍后以其他方式破坏它并说工具无法帮助你时。
我想你大概能猜出我推荐哪一个。我想说的是,如果你对某个话题感兴趣,哪怕只是一瞬间,你也可以利用这种好奇心,在学习过程中获得一项新技能。特别是像这样的文件 - 该shadow
文件是一种相当基本的格式,我对它知之甚少是在破坏它之后才了解到的偶然- 这不是我对该文件进行编辑的结果。
相反,我的问题发生在包管理数据库的一些其他错误导致包管理器覆盖它而不保存备份并且系统上的所有用户都被创建之后卡普特。进一步无知的笨拙尝试修复只会将损坏传播到其他相关文件,不久之后我就不得不从一个文件恢复大部分/etc
文本文件。(比希望的要晚一些)备份。
一旦我这样做了,并确认我已经处于可行状态,我决定故意、细致地再做一次。再一次。这都是几个月前的事了,但今天我仍然有信心,我可以通过检查login
系统上的单个日志文件来诊断问题的根源,并使用任何基本编辑器解决它(并且也许可以看一两眼man 5 problem_file
)仅提供对受影响的根文件系统的基本访问。它的获得并不便宜——我花了大半天的时间——而且相关的配置文件遍布整个目录(甚至有些 - 例如 Linux PAM /var/run/no_login
- 在其他安装上)- 但这是值得做的。还有它可以稍加考虑就会更便宜。
这个故事的寓意是,它可能是不是shadow
一件好事,诸如、passwd
、groups
、之类的关键任务配置的格式shells
对我们来说应该如此不透明,以至于我们必须使用特殊的编辑工具,这些工具可能会也可能不会以我们不明白的方式和原因纠正我们的工作,只是为了实现一个简单的效果。改变。我认为至少值得我们花时间去准确了解他们会采取哪些与我们不同的做法。
大概是是然而,一件好事是,一旦我们足够熟悉编辑所述文件,我们就冒着在其中创建并随后保存到其中的印刷或简单语法错误的风险,我们可以使用一些工具来仔细检查我们的工作在应用我们的 blas 编辑之前我们已经了解的方式和原因。
答案3
反点 - 如果您需要将一组用户登录名从一台服务器复制到另一台服务器,而不知道他们当前的密码或为其分配新密码,那么您需要直接编辑 /etc/shadow 以插入散列密码字段。 vipw 不允许您触摸该字段,它只是“*”
更新:或者在这种情况下使用 chpasswd -e“哈希密码”,但这只能直接在计算机上完成。如果您正在处理一组尚未部署到计算机(例如虚拟机)的文件,那么直接编辑可能是您唯一的解决方案。
即通常有一个工具可以做你想做的事情,而无需直接编辑 /etc/shadow,你只需要知道它是什么......
答案4
需要编辑这些文件的另一个原因是,如果您正在编辑将在另一个系统上启动的文件系统映像中的文件,并且需要在启动后调试该系统。例如,在调试失败或救援模式下使用的 MAAS 临时文件系统。
永远不要说永远……除非你是认真的。