我一直负责将信息和帐户从一台Linux服务器迁移到另一台。 我觉得自己有信心pipe理Linux服务器,但是我从来没有试过这样的举动。
谷歌search,我发现这篇文章。 http://www.cyberciti.biz/faq/howto-move-migrate-user-accounts-old-to-new-server/
这非常有帮助。 不过,我还有一些问题仍然存在…
我仍然不明白如何制作影子密码。 如果我只是从/ etc / passwd和/ etc / shadow拖放用户,它实际上会工作吗? 我如何确保密码哈希是相同的? 什么盐?
如果我需要重构用户/组ID,移动机器上的$ usermod -g (newgid) username是否会修改移动用户文件上的ID?
对于第一个问题,如果您的影子文件为$ 1 $ FZPUn / 2R $ JsQCE3TP3Uraez2P8ISIh0密码格式(开头为美元,数字,美元),则不存在盐问题。 因为,盐是下一个美元之间的第一部分(在我的例子中是FZPUn / 2R)。 剩下的就是encryption的密码。 有关详细信息,请参阅“Glibc备注”部分中的man crypt。
所以你可以移动你的影子文件没有风险。
对于第二部分,我更喜欢直接编辑/ etc / passwd文件并更改grouy manualy。 你的方法可能是最好的(因为locking)。
不要忘记文件:如果您更改UID或GID,则必须将每个文件都chown以授权您的用户阅读他的文件!
阴影密码是旧的密码文件曾经是。
不幸的是使用的术语,但“密码文件”(/ etc / passwd)通常不再包含密码信息。 它包含用户信息(特别是GECOS )
历史上/ etc / passwd也包含你的密码的散列。 但是,/ etc / passwd需要由某些系统程序读取,因为它包含重要的用户信息(UID,主要GID,主目录等)
所以,不要打破所有的事情,Unix的方式是允许向后兼容。 所以/ etc / passwd没有被改变,一个新的密码文件/ etc / shadow被创build,并且/ etc / passwd中的密码字段被空白。
/ etc / shadow现在只包含validation所需的最less信息(这样/ / etc / passwd和/ etc / shadow就不需要被login访问了)。
影子密码文件中最重要的部分是限制性更强的权限。
$ ls -l /etc/shadow /etc/passwd -rw-r--r-- 1 root root 2041 2009-08-18 13:24 /etc/passwd -rw-r----- 1 root shadow 1213 2009-08-18 13:24 /etc/shadow
正如你所看到的,每个人都可以从/ etc / passwd中读取,而/ etc / shadow只能在我的Ubuntu系统上由root和shadow组读取(这是一个Ubuntu-ism-许多系统只允许root读取,影子“显然是一个特权系统组)。
同样,历史上,你的密码是使用DESencryption的,但是大多数现代发行版使用更安全的密码(我现在暂时说,但它比DES更安全)使用MD5algorithm。 任何以$ 1 $开头的密码哈希值都是MD5哈希值。
由另一张海报解释的盐包含在哈希本身中,所以这些可以从一台机器安全地复制到另一台机器。
除非实际需要指定目标uid / gid,否则不需要重构用户和组ID。 据推测目标系统或不同的uid / gid编号scheme有冲突,所以这通常不是必需的。 在这种情况下,你不需要涉及这里的uid / gid muckyness。 usermod -g也取一个名字和一个数字。
如果你只是在(即不使用useradd / groupadd)工具中复制密码文件,那么你将只需要用户模式 - 所有的用户与他们的主要组)。
如果有UID / GID更改,则可能还需要更改用户文件的权限。 这有点棘手,但我已经在下面包含了一些代码。 希望它工作正常!
#!/bin/bash ## Variables to change HOMEDIR="/home" OLDPASSWD="oldpasswd" OLDGROUP="oldgroup" ## System binaries - shouldn't need to change AWK="/usr/bin/awk" GREP="/bin/grep" FIND="/usr/bin/find" XARGS="/usr/bin/xargs" CHOWN="/bin/chown" CHGRP="/bin/chgrp" ${AWK} -F":" '{print $1,$3}' < ${OLDPASSWD} | \ while read user uid; do if [ $? -ne 0 ]; then echo "EOF" fi echo "[uid: ${uid} -> ${user} on ${HOMEDIR}]" ${FIND} ${HOMEDIR} -uid ${uid} -print0 | \ ${XARGS} --no-run-if-empty -0 ${CHOWN} ${user} done ${AWK} -F":" '{print $1,$3}' < ${OLDGROUP} | \ while read group gid; do if [ $? -ne 0 ]; then echo "EOF" fi echo "[gid: ${gid} -> ${group} on ${HOMEDIR}]" ${FIND} ${HOMEDIR} -gid ${gid} -print0 | \ ${XARGS} --no-run-if-empty -0 ${CHGRP} ${group} done
您将需要从正在迁移的计算机上的旧的/ etc / passwd和/ etc / group。 当你复制用户的内容时(如果你使用tar,使用'p'标志来保留权限),当你提取时应该保留uid / gid。 这可能意味着每个用户主目录中的一大堆他们不拥有的文件。
这有两点:
它贯穿passwd文件的每一行,并抓取旧的uid和用户名。 它find/ home中的所有属于旧uid的文件并运行
CHOWN
它遍历旧组文件中的每个组,并抓取旧的gid和组名。 它find/ home中的所有文件,由旧的gid拥有并运行
chgrp命令
您可以编辑旧的passwd文件,仅对处于家中的用户执行此操作
例如
grep "/home" oldpasswd > oldpasswd.filter
或者仅限特定UID范围内的某些用户(下例中为100和200)。
awk -F":" '$3 > 100 && $3 < 200 {print $0}' oldpasswd > oldpasswd.filter
正如您已经意识到的那样,这里棘手的部分是使用新的UID / GID信息重新标记所有文件。 如果您使用usermod来更改UID,它将修复用户拥有的文件在他们的主目录中,但这是免费的 – 这只是这些文件,并没有协助gid的变化。 要进行组更改或确保您获得了所有用户的文件(而不仅仅是家中的文件),则需要在整个文件系统中运行查找来查找它们。 在更改用户的UID和GID方面有一个很好的例子。