克隆Linux用户(复制用户,基于另一个)


14

如何创建一个新的系统用户,另一个用户的精确副本(具有相同的组,权限,特权和设置),但是具有不同的用户名,密码和主目录?


Linux的犯规有任何规范的方法,你必须写一个脚本....
波斯湾

2
命令,脚本或操作方法一
无所

所以我回答你……
PersianGulf

Answers:


9

这个脚本可以做到:

#!/bin/bash
SRC=$1
DEST=$2

SRC_GROUPS=$(id -Gn ${SRC} | sed "s/${SRC} //g" | sed "s/ ${SRC}//g" | sed "s/ /,/g")
SRC_SHELL=$(awk -F : -v name=${SRC} '(name == $1) { print $7 }' /etc/passwd)

useradd --groups ${SRC_GROUPS} --shell ${SRC_SHELL} --create-home ${DEST}
passwd ${DEST}

它获取源用户的组(不包括与其登录名相同的组)和外壳程序,然后创建具有相同外壳程序和辅助组的新用户。

Usage: clone-user src_user_name new_user_name

没有错误检查,它只是一个快速而肮脏的克隆脚本。


1
是的,有趣又快速又肮脏:如果登录名是任何组名的前缀或后缀,将失败。例如,登录是john,组之一是johnny。这里是发生了什么:SRC=john ; echo "$SRC group1 johnny group3" | sed "s/ ${SRC}//g" | sed "s/ /,/g"输出:john,group1ny,group3
斯特凡纳·古里科

感谢您创建此脚本。我建议这样更改SRC_GROUPS,SRC_GROUPS=$(id -Gn ${SRC} | sed "s/ /,/g" | sed -r 's/\<'${SRC}'\>\b,?//g') 这将正确删除确切的用户组名称,而不是部分字符串匹配。例如 如果用户的ID为“ pi”,并且用户具有包括“ pi,gpio,spi等”的组,则只会删除“ pi”,而不会删除其他部分字符串匹配项。
Phil

5
  • 编辑/ etc / passwd并复制您想要的确切副本的用户行。修改登录名,真实名称和主目录。
  • 编辑/ etc / shadow,然后再次复制原始用户的行。修改登录名。
  • 最后执行passwd newuser修改密码。

请注意,系统明智地,两个用户都是相同的(相同的UID),因此一个用户将可以输入另一个用户的主目录并随意进行修改。


这几乎肯定是最简单的方法。但是,如果您不希望UID实际上是同一用户,那么修改UID可能也是个好主意。–
Wildcard

1
@Wildcard,但是它将不是一个克隆,它将是一个新用户,并且可以通过一个简单的完成该任务useradd。现在,我考虑了一下,您可以采用另一种方法,使用创建新用户,useradd然后修改UID和GID以克隆第一个用户。
YoMismo

3

对于Linux Mint 18 Mate

基于Mike Anderson的脚本,我编写了一个脚本,询问有关新用户,旧用户,新密码的问题,然后复制旧用户的主目录,并用新的新主目录替换旧用户名的所有实例。用户名。

我的脚本中与useradd行有关的主要区别在于,passwd在Linux Mint 18中失败,由chpasswd代替。为了使密码正常工作,我创建了新行:echo $ newuser:$ newpassword | chpasswd。

另一个区别是我无法使--create-home工作,因此我只是在新行中使用了mkdir。

请注意您是否有一个庞大的旧用户主目录。

拿走您需要的东西,剩下的就剩下。您应对所复制的任何代码负责-进行备份!

#!/bin/bash

# clone a user
# usage:
# if you named this as below then
# change to the directory and run this command
# sudo bash clone-user.sh

echo "============="
echo "this script will create a new user"
echo "based on an existing user's data"
echo 
echo "You will be shown a list of users who can currently log on"
echo "Remember which user you would like to clone."
echo "You will be asked for the new user's name, their password"
echo "and the old user to clone".
echo "============="
echo 

echo -n "New user's name: "
read newuser

echo -n "New user's password: "
read newpassword

echo 

echo "Current users you can clone:"
echo "----"
awk -F'[/:]' '{if ($3 >= 1000 && $3 != 65534) print $1}' /etc/passwd
echo 

echo -n "Old user to clone: "
read olduser

echo 
echo "You have selected: "
echo "----"
echo "new user: $newuser"
echo "new user password: $newpassword"
echo "old user: $olduser"
echo 

olduser_GROUPS=$(id -Gn ${olduser} | sed "s/${olduser} //g" | sed "s/ ${olduser}//g" | sed "s/ /,/g")
olduser_SHELL=$(awk -F : -v name=${olduser} '(name == $1) { print $7 }' /etc/passwd)

echo "old user groups: "
echo "----"
echo $olduser_GROUPS
echo "olduser shell: "
echo $olduser_SHELL
read -rsp $'Press any key to continue or ctrl-c to exit...\n' -n1 key

useradd --groups $olduser_GROUPS --shell $olduser_SHELL $newuser

echo $newuser:$newpassword | chpasswd

read -rsp $'ready to make home direcoty -- ctrl-c to exit...\n' -n1 key

mkdir /home/$newuser
chown -R $newuser:$newuser /home/$newuser

echo 
echo "Script should be done now."
echo 
echo "Do you see your new users name below?"
echo 
awk -F'[/:]' '{if ($3 >= 1000 && $3 != 65534) print $1}' /etc/passwd

echo 
echo "We are now going to copy the old user's home folder to the new user"
echo "then change ownership to the new user"
echo 
read -rsp $'Ready to copy home folder --- or ctrl-c to exit...\n' -n1 key

rsync -aPv /home/$olduser/. /home/$newuser/
chown -R --from=$olduser $newuser:$newuser /home/$newuser

echo 
echo "Now we are going to change the names of files and folders to the new user"
echo 

grep -rlI $olduser /home/$newuser/ . | sudo xargs sed -i 's/$olduser/$newuser/g'

echo 
echo "Done now."
echo 
read -rsp $'Press any key to exit...\n' -n1 key
echo 
echo 

感谢世界上所有帮助我编写此脚本的人。约翰在俄勒冈州


意见建议:检查权限是否正确,我第一次尝试在不使用sudo的情况下运行,脚本变得很远。Allso会对grep .bashrc / .zshrc等用于“ / home / $ olduser”有帮助,并警告或提议用$ HOME替换,如果找到的话,当保留对旧用户主目录的引用时,这非常令人困惑
Mike

感谢您创建这个。我建议这样更改olduser_GROUPS,olduser_GROUPS=$(id -Gn ${olduser} | sed "s/ /,/g" | sed -r 's/\<'${olduser}'\>\b,?//g')这将正确删除确切的用户组名称,而不是部分字符串匹配。例如 如果用户的ID为“ pi”,并且用户具有包括“ pi,gpio,spi等”的组,则只会删除“ pi”,而不会删除其他部分字符串匹配项。
Phil

1

如您所知,Unix用户作为UID而不是名称,例如:mohsen被称为1001或组mohsen被称为1001。
您必须编写脚本并逐步执行以下步骤:

  1. 查找给定用户的uid和gid
  2. 查找其主目录。
  3. 查找用户所属的组。
  4. 阅读/etc/suduers并说明您的用户。
  5. 区分隐藏文件,链接文件,垃圾文件和与本机有关的文件非常重要。
  6. 根据之前的数字压缩其主目录。
  7. 根据其他规范(例如配置等)创建一个元目录。
  8. scp 在您的目标上。
  9. 当然,解压缩和使用home dir本身是一个很大的概念。

注意:请勿使用脚本,并逐步使用以上注释。即使您可以插入上方。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.