Пользователь Clone Linux (копирование пользователя на основе другого)

13

Как я могу создать нового системного пользователя, точную копию другого (с такими же группами, разрешениями, привилегиями и настройками), но с другим именем пользователя, паролем и домашним каталогом?

Sfisioza
источник
У Linux нет канонического способа, вы должны написать скрипт ....
PersianGulf
2
Без разницы команда, сценарий или инструкция :) Вопрос в том, как это сделать :)
Sfisioza
Так что я отвечу вам ...
Персидский залив

Ответы:

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') что позволит правильно удалить точное имя группы пользователей, а не частичное совпадение строк. Ex. Если идентификатор пользователя равен «pi», а у пользователя есть группы, включающие «pi, gpio, spi и т. Д.», Он удалит только «pi», а не совпадет с другой частичной строкой.
Фил
5
  • Отредактируйте / etc / passwd и продублируйте строку пользователя, точную копию которого вы хотите. Измените имя входа, настоящее имя и домашний каталог.
  • Отредактируйте / etc / shadow и снова продублируйте строку исходного пользователя. Измените имя входа.
  • Наконец, выполните, passwd newuserчтобы изменить пароль.

Помните, что в системе оба пользователя одинаковы (один и тот же UID), поэтому один сможет войти в домашний каталог другого и изменить его по своему усмотрению.

YoMismo
источник
Это почти наверняка самый простой способ. Однако было бы неплохо изменить и UID, если вы не собираетесь, чтобы они фактически были одним и тем же пользователем ...
Wildcard
1
@Wildcard, но тогда это не был бы клон, это был бы новый пользователь, и эту задачу можно решить с помощью простого useradd. Теперь, когда я думаю об этом, вы можете сделать это наоборот, создать нового пользователя useraddи затем изменить UID и GID для клонирования первого.
YoMismo
3

Для Linux Mint 18 Mate

Основываясь на сценарии Майка Андерсона, я создал такой, который задает вопросы о новом пользователе, старом пользователе, новом пароле, а затем копирует домашний каталог старого пользователя и заменяет все экземпляры имени старого пользователя в новом домашнем каталоге новым имя пользователя

Основное различие в моем сценарии относительно строки 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 

Спасибо всем в мире, кто помог мне с этим сценарием. Джон в Орегоне

OregonJohn
источник
Предложения: проверьте правильность разрешений, я попытался запустить без 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')которое будет правильно удалять точное имя группы пользователей, а не частичное совпадение строк. Ex. Если идентификатор пользователя равен «pi», а у пользователя есть группы, включающие «pi, gpio, spi и т. Д.», Он удалит только «pi», а не совпадет с другой частичной строкой.
Фил
1

Как вы знаете, пользователи Unix в качестве идентификаторов UID не называются. Например: mohsen, известный как 1001, или группа mohsen, известная как 1001.
Вам необходимо написать скрипт и выполнить следующие шаги:

  1. Найти uid и gid данного пользователя
  2. Найдите его домашний каталог.
  3. Найдите группы, в которые входит пользователь.
  4. Читайте /etc/suduersи состояние вашего пользователя.
  5. Для вас очень важно различать скрытые файлы, файлы ссылок, файлы мусора и файлы, связанные с вашим собственным компьютером.
  6. По предыдущему номеру сжимаем его домашний реж.
  7. Создать мета-каталог в соответствии с другими спецификациями, такими как конфигурации и так далее.
  8. scp на вашей цели.
  9. Конечно, распаковка и использование домашнего каталога сама по себе имеет большую концепцию.

ПРИМЕЧАНИЕ: не используйте скрипт и используйте вышеприведенные заметки шаг за шагом. Даже вы можете вставить выше.

Персидский залив
источник
-2

Попробуйте эту команду

useradd -N -g gid -G gid2,gid3 -m
будка
источник
1
Это не ответ. Постер хочет клонировать пользователя.
Персидский залив
Этот код был украден без ссылки и описания!
kyb