Клон користувача Linux (скопіювати користувача на основі іншого)


14

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


У 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') який належним чином видалить точне ім'я групи користувачів на відміну від часткового збігу рядків. Вих. Якщо ідентифікатор користувача "pi", а у користувача є групи, включаючи "pi, gpio, spi тощо", він видалить лише "pi", а не інші часткові рядкові збіги.
Філ

5
  • Відредагуйте / etc / passwd і скопіюйте рядок користувача, якого ви хочете отримати в точній копії. Змініть ім’я для входу, справжнє ім’я та домашній каталог.
  • Відредагувати / etc / shadow і знову повторити рядок початкового користувача. Змініть ім’я для входу.
  • Нарешті виконати, passwd newuserщоб змінити пароль.

Майте на увазі, що системні мудрі обидва користувачі однакові (однаковий UID), тому один зможе увійти в домашній каталог іншого та змінити за бажанням.


Це майже напевно найпростіший спосіб. Однак може бути хорошою ідеєю також змінити 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 

Дякую всім у світі, хто допоміг мені в цьому сценарії. Іоанна в Орегоні


Пропозиції: перевірте правильність дозволів, я спробував запустити без судового вперше, сценарій стає досить далеко. Allso було б корисно grep .bashrc / .zshrc тощо для "/ home / $ olduser" і попередити або запропонувати замінити на $ HOME, якщо знайдеться, це дуже заплутано, коли посилання на домашній каталог старого користувача залишаються
Майк

Дякуємо, що створили це. Я пропоную змінити olduser_GROUPS як такий, olduser_GROUPS=$(id -Gn ${olduser} | sed "s/ /,/g" | sed -r 's/\<'${olduser}'\>\b,?//g')що дозволить належним чином видалити точне ім’я групи користувачів на відміну від часткового збігу рядків. Вих. Якщо ідентифікатор користувача "pi", а у користувача є групи, включаючи "pi, gpio, spi тощо", він видалить лише "pi", а не інші часткові рядкові збіги.
Філ

1

Як відомо, користувачі Unix як UID не називають, для Exampel: mohsen, відомий як 1001, або mohsen групи, відомий як 1001.
Ви повинні написати сценарій і виконувати крок за кроком наступні кроки:

  1. Знайдіть uid та gid даного користувача
  2. Знайдіть його домашній каталог.
  3. Знайдіть групи, учасниками яких є користувач.
  4. Читання /etc/suduersта стан вашого користувача.
  5. Вам дуже важливо розрізняти приховані файли, файли посилань, сміттєві файли та файли, пов’язані з вашою рідною машиною.
  6. За попереднім номером стискають свій домашній дір.
  7. Створіть метарежир відповідно до інших специфікацій, таких як конфігурації тощо.
  8. scp на вашу ціль.
  9. Звичайно, самому розгортання та використання домашнього режиму має велике поняття.

ПРИМІТКА. Не використовуйте сценарій і не використовуйте вищезазначені примітки крок за кроком. Навіть ви можете вставити вище.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.