Clona utente Linux (copia utente, basato su un altro)


13

Come posso creare un nuovo utente di sistema, una copia esatta di un altro (con gli stessi gruppi, autorizzazioni, privilegi e impostazioni), ma con nome utente, password e home directory diversi?


Linux non ha alcun modo canonico, devi scrivere una sceneggiatura ....
PersianGulf

2
Nessuna differenza una volta comando, script o howto :) La domanda è come farlo :)
Sfisioza,

Quindi ti rispondo ...
Golfo Persico

Risposte:


9

Questo script lo farà:

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

Ottiene i gruppi dell'utente di origine (escluso il gruppo uguale al proprio login) e la shell, quindi crea un nuovo utente con la stessa shell e i gruppi secondari.

Usage: clone-user src_user_name new_user_name

Non c'è controllo degli errori, è solo uno script clone rapido e sporco.


1
Sì, interessante ma veloce e sporco: fallirà se un nome di accesso è un prefisso o suffisso di qualsiasi nome di gruppo. Ad esempio il login è john, uno dei gruppi è johnny. Ecco cosa succede: SRC=john ; echo "$SRC group1 johnny group3" | sed "s/ ${SRC}//g" | sed "s/ /,/g"Uscita:john,group1ny,group3
Stéphane Gourichon,

Grazie per aver creato questo script. Suggerisco di modificare SRC_GROUPS in quanto tale. SRC_GROUPS=$(id -Gn ${SRC} | sed "s/ /,/g" | sed -r 's/\<'${SRC}'\>\b,?//g') Questo rimuoverà correttamente il nome esatto del gruppo di utenti rispetto a una corrispondenza di stringa parziale. Ex. Se l'ID di un utente è 'pi' e un utente ha gruppi tra cui 'pi, gpio, spi, ecc.' Rimuoverà solo 'pi' e non le altre corrispondenze di stringhe parziali.
Phil

5
  • Modifica / etc / passwd e duplica la riga dell'utente di cui desideri una copia esatta. Modifica il nome di accesso, il nome reale e la home directory.
  • Modifica / etc / shadow e duplica nuovamente la riga dell'utente originale. Modifica il nome di accesso.
  • Infine eseguire passwd newuserper modificare la password.

Essere consapevoli del fatto che per quanto riguarda il sistema entrambi gli utenti sono uguali (stesso UID), quindi uno sarà in grado di accedere alla directory principale dell'altro e modificarlo a piacimento.


Questo è quasi sicuramente il modo più semplice. Tuttavia, potrebbe essere una buona idea modificare anche l'UID se non si intende che siano effettivamente lo stesso utente ....
Wildcard,

1
@Wildcard, ma non sarebbe un clone, sarebbe un nuovo utente e quell'attività può essere eseguita con un semplice useradd. Ora che ci penso, puoi farlo al contrario, creare un nuovo utente useradde quindi modificare UID e GID per clonare il primo.
YoMismo,

3

Per Linux Mint 18 Mate

Basato sullo script di Mike Anderson, ne ho creato uno che pone domande sul nuovo utente, il vecchio utente, la nuova password, quindi copia la home directory dell'utente precedente e sostituisce tutte le istanze del nome dell'utente vecchio nella nuova home directory con la nuova nome dell'utente.

La differenza principale nel mio script per quanto riguarda la riga useradd è che il passwd fallisce in Linux Mint 18, sostituito da chpasswd. Per far funzionare la password ho dovuto creare una nuova riga: echo $ newuser: $ newpassword | chpasswd.

Un'altra differenza è che non sono riuscito a far funzionare --create-home, quindi ho appena usato mkdir in una nuova linea.

Fai attenzione se hai una grande home directory di un vecchio utente.

Prendi ciò di cui hai bisogno e lascia il resto. Sei responsabile per qualsiasi codice copiato: esegui backup!

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

Grazie a tutti nel mondo che mi hanno aiutato con questa sceneggiatura. John in Oregon


Suggerimenti: controlla i permessi corretti, ho provato a correre senza sudo la prima volta, lo script arriva abbastanza lontano. Inoltre sarebbe utile per grep .bashrc / .zshrc ecc. Per "/ home / $ olduser" e avvertire o offrire di sostituire con $ HOME se trovato, è molto confuso quando rimangono riferimenti alla home directory dell'utente precedente
Mike

Grazie per averlo creato. Suggerisco di cambiare il vecchio user_GROUPS in quanto tale olduser_GROUPS=$(id -Gn ${olduser} | sed "s/ /,/g" | sed -r 's/\<'${olduser}'\>\b,?//g')che rimuoverà correttamente il nome esatto del gruppo di utenti rispetto a una corrispondenza di stringa parziale. Ex. Se l'ID di un utente è 'pi' e un utente ha gruppi tra cui 'pi, gpio, spi, ecc.' Rimuoverà solo 'pi' e non le altre corrispondenze di stringhe parziali.
Phil

1

Come sapete, gli utenti Unix come UID non nominano, per esempio: mohsen noto come 1001 o gruppo mohsen noto come 1001.
Devi scrivere uno script ed eseguire passo dopo passo i seguenti passaggi:

  1. Trova uid e gid dell'utente specificato
  2. Trova la sua home directory.
  3. Trova gruppi di cui l'utente è membro.
  4. Leggi /etc/suduerse stato del tuo utente.
  5. È molto importante distinguere tra file nascosti, file di collegamento, file garbage e file relativi al computer nativo.
  6. Secondo il numero precedente comprimere la sua home directory.
  7. Crea una meta dir in base ad altre specifiche come configurazioni e così via.
  8. scp sul tuo obiettivo.
  9. Naturalmente, decomprimere e l'uso di home dir è esso stesso ha un grande concetto.

NOTA: non utilizzare lo script e utilizzare le note sopra passo per passo. Anche tu puoi inserire sopra.


-2

Prova questo comando

useradd -N -g gid -G gid2,gid3 -m

1
Non è una risposta. Poster vuole clonare l'utente.
Golfo Persico,

Questo codice è stato rubato senza link e descrizione!
Kyb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.