Klonuj użytkownika Linuksa (kopiuj użytkownika na podstawie innego)

14

Jak mogę utworzyć nowego użytkownika systemu, dokładną kopię innego użytkownika (mającego te same grupy, uprawnienia, uprawnienia i ustawienia), ale z inną nazwą użytkownika, hasłem i katalogiem domowym?

Sfisioza
źródło
Linux nie ma żadnego kanonicznego sposobu, musisz napisać skrypt ....
PersianGulf
2
Bez różnicy raz polecenie, skrypt lub howto :) Pytanie brzmi: jak to zrobić :)
Sfisioza
Odpowiadam więc ...
PersianGulf

Odpowiedzi:

9

Ten skrypt to zrobi:

#!/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}

Pobiera źródłowe grupy użytkowników (nie licząc grupy, która jest taka sama jak ich login) i powłokę, a następnie tworzy nowego użytkownika z tą samą powłoką i grupami pomocniczymi.

Usage: clone-user src_user_name new_user_name

Nie ma sprawdzania błędów, to tylko szybki i brudny skrypt klonowania.

Mike Anderson
źródło
1
Tak, ciekawe, ale szybkie i brudne: nie powiedzie się, jeśli nazwa logowania jest przedrostkiem lub przyrostkiem dowolnej nazwy grupy. Np. Login to johnjedna z grup johnny. Oto, co się dzieje: SRC=john ; echo "$SRC group1 johnny group3" | sed "s/ ${SRC}//g" | sed "s/ /,/g"Wyjście:john,group1ny,group3
Stéphane Gourichon
Dziękujemy za utworzenie tego skryptu. Sugeruję zmianę SRC_GROUPS jako taką, SRC_GROUPS=$(id -Gn ${SRC} | sed "s/ /,/g" | sed -r 's/\<'${SRC}'\>\b,?//g') która odpowiednio usunie dokładną nazwę grupy użytkowników, a nie częściowe dopasowanie ciągu. Dawny. Jeśli identyfikator użytkownika to „pi”, a użytkownik ma grupy, w tym „pi, gpio, spi itp.”, Usunie tylko „pi”, a nie inne częściowe ciągi pasujące.
Phil
5
  • Edytuj plik / etc / passwd i zduplikuj wiersz użytkownika, którego chcesz dokładną kopię. Zmodyfikuj nazwę logowania, prawdziwą nazwę i katalog domowy.
  • Edytuj / etc / shadow i ponownie zduplikuj linię pierwotnego użytkownika. Zmodyfikuj nazwę logowania.
  • Na koniec uruchom, passwd newuseraby zmodyfikować hasło.

Należy pamiętać, że pod względem systemowym obaj użytkownicy są tym samym (tym samym UID), więc można wejść do katalogu domowego drugiego użytkownika i dowolnie modyfikować.

YoMismo
źródło
To prawie na pewno najprostszy sposób. Jednak dobrym pomysłem może być również modyfikacja UID, jeśli nie masz zamiaru być tym samym użytkownikiem ...
Wildcard,
1
@Wildcard, ale wtedy nie byłby to klon, byłby to nowy użytkownik i zadanie to można wykonać w prosty sposób useradd. Teraz, gdy o tym myślę, możesz to zrobić na odwrót, utworzyć nowego użytkownika za pomocą, useradda następnie zmodyfikować UID i GID, aby sklonować pierwszego.
YoMismo,
3

Dla systemu Linux Mint 18 Mate

Opierając się na skrypcie Mike'a Andersona, stworzyłem taki, który zadaje pytania o nowego użytkownika, starego użytkownika, nowe hasło, a następnie kopiuje katalog domowy starego użytkownika i zastępuje wszystkie wystąpienia nazwy starego użytkownika w nowym katalogu domowym nowym nazwa użytkownika.

Główną różnicą w moim skrypcie dotyczącą linii useradd jest to, że passwd nie działa w Linux Mint 18, zastąpiony przez chpasswd. Aby hasło działało, musiałem utworzyć nową linię: echo $ newuser: $ newpassword | chpasswd.

Kolejna różnica polega na tym, że nie mogłem zmusić --create-home do pracy, więc zamiast tego użyłem mkdir w nowej linii.

Uważaj, jeśli masz ogromny katalog domowy starego użytkownika.

Weź to, czego potrzebujesz, a resztę zostaw. Jesteś odpowiedzialny za każdy skopiowany kod - rób kopie zapasowe!

#!/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 

Dziękujemy wszystkim na świecie, którzy pomogli mi z tym skryptem. John w Oregonie

OregonJohn
źródło
Sugestie: sprawdź poprawność uprawnień, za pierwszym razem próbowałem uruchomić program bez sudo, skrypt jest dość daleko. Pomocne byłoby także grep .bashrc / .zshrc itp. Dla „/ home / $ olduser” i ostrzeżenie lub zaoferowanie zamiany na $ HOME, jeśli zostanie znalezione, to bardzo mylące, gdy pozostają odniesienia do katalogu domowego starego użytkownika
Mike
Dziękujemy za utworzenie tego. Sugeruję zmianę olduser_GROUPS jako taką, olduser_GROUPS=$(id -Gn ${olduser} | sed "s/ /,/g" | sed -r 's/\<'${olduser}'\>\b,?//g')która odpowiednio usunie dokładną nazwę grupy użytkowników, a nie częściowe dopasowanie ciągu. Dawny. Jeśli identyfikator użytkownika to „pi”, a użytkownik ma grupy, w tym „pi, gpio, spi itp.”, Usunie tylko „pi”, a nie inne częściowe ciągi pasujące.
Phil
1

Jak wiadomo, użytkownicy uniksowi jako identyfikatory UID nie mają nazwy, Na przykład: mohsen znany jako 1001 lub grupowy mohsen znany jako 1001.
Musisz napisać skrypt i wykonać krok po kroku następujące kroki:

  1. Znajdź identyfikator użytkownika i identyfikator użytkownika
  2. Znajdź swój katalog domowy.
  3. Znajdź grupy, których użytkownik jest ich członkiem.
  4. Przeczytaj /etc/suduersi stan swojego użytkownika.
  5. Bardzo ważne jest, abyś rozróżniał ukryte pliki, pliki łączy, pliki śmieci i pliki związane z twoim rodzimym komputerem.
  6. Według poprzedniego numeru skompresuj jego domowy reż.
  7. Utwórz meta katalog zgodnie z innymi specyfikacjami, takimi jak konfiguracje i tak dalej.
  8. scp na twoim celu.
  9. Oczywiście sama dekompresja i korzystanie z domowego katalogu ma dużą koncepcję.

UWAGA: Nie używaj skryptu i używaj powyższych notatek krok po kroku. Nawet możesz wstawić powyżej.

Zatoka Perska
źródło
-2

Wypróbuj to polecenie

useradd -N -g gid -G gid2,gid3 -m
Stragan
źródło
1
To nie jest odpowiedź. Plakat chce sklonować użytkownika.
PersianGulf
Ten kod został skradziony bez linku i opisu!
Kyb