ajout du script create-user, pour créer un utilisateur sudoer et lui installer une clé publique ssh
This commit is contained in:
		
							parent
							
								
									5524d3f245
								
							
						
					
					
						commit
						35a55f07d1
					
				
							
								
								
									
										173
									
								
								create-user
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										173
									
								
								create-user
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,173 @@ | ||||
| #!/bin/bash | ||||
| # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 | ||||
| source "$(dirname "$0")/lib/ulib/ulib" || exit 1 | ||||
| urequire DEFAULTS | ||||
| 
 | ||||
| function display_help() { | ||||
|     uecho "$scriptname: créer un utilisateur sudoer et lui installer une clé publique ssh | ||||
| 
 | ||||
| USAGE | ||||
|     $scriptname user [-p pubkey] | ||||
| 
 | ||||
| OPTIONS | ||||
|     -p, --pkfile PKFILE | ||||
|         Installer la clé publique ssh contenue dans le fichier spécifié. Par | ||||
|         défaut, prendre le fichier ~/.ssh/id_rsa.pub de l'utilisateur courant. | ||||
|     -s, --pkstring PUBKEY | ||||
|         Installer la clé publique ssh spécifiée. Cette option avancée n'est pas | ||||
|         utilisée en temps normal. Elle a la priorité sur l'option --pkfile | ||||
|     -l, --luser | ||||
|         Ne pas donner à l'utilisateur le droit de sudoer. | ||||
|     -h, --host [USER@]HOST | ||||
|         Créer l'utilisateur sur l'hôte distant spécifié. Si l'utilisateur | ||||
|         distant n'est pas root, il doit être sudoer. | ||||
|     -T, --tmproot TMPROOT | ||||
|         Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple | ||||
|         /var/tmp. Cette option est utile pour certains serveurs, qui ont un /tmp | ||||
|         minuscule. | ||||
|     -S, --ssh SSH | ||||
|         Spécifier le programme à utiliser pour la connection par ssh." | ||||
| } | ||||
| 
 | ||||
| function create_user() { | ||||
|     # Créer le user, si nécessaire | ||||
|     # retourner vrai si le user a été créé, faux si ce n'était pas nécessaire | ||||
|     local user="$1" password="$2" | ||||
|     [ -z "$(getent passwd "$user")" ] || return 1 | ||||
|     estep "Creation de l'utilisateur $user..." | ||||
|     useradd -s /bin/bash -m "$user" | ||||
|     [ -n "$password" ] || return 0 | ||||
|     if ! (echo "$password" | passwd --stdin "$user" 2>/dev/null); then | ||||
|         echo "$user:$password" | chpasswd | ||||
|     fi | ||||
|     return 0 | ||||
| } | ||||
| 
 | ||||
| function init_sudoer() { | ||||
|     local user="$1" | ||||
|     local TAB=$'\t' | ||||
|     if [ -d /etc/sudoers.d ]; then | ||||
|         if [ ! -f "/etc/sudoers.d/$user" ]; then | ||||
|             estep "Ajout de $user comme sudoer dans /etc/sudoers.d/$user" | ||||
|             echo "$user${TAB}ALL=(ALL) NOPASSWD: ALL" >"/etc/sudoers.d/$user" | ||||
|             chmod 440 "/etc/sudoers.d/$user" | ||||
|         fi | ||||
|     elif [ -f /etc/sudoers ]; then | ||||
|         if ! grep -q "^$user" /etc/sudoers; then | ||||
|             estep "Ajout de user comme sudoer dans /etc/sudoers..." | ||||
|             echo "$user${TAB}ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| function install_pubkeys() { | ||||
|     # Installer la clé $1 pour l'utilisateur $2 | ||||
|     # $1 peut contenir autant de clés que nécessaire, une par ligne | ||||
|     local user="$1" pubkeys="$2" | ||||
|     local homedir="$(eval "echo ~$user")" | ||||
|     [ -d "$homedir" ] || return | ||||
| 
 | ||||
|     local sshdir="$homedir/.ssh" | ||||
|     if [ ! -d "$sshdir" ]; then | ||||
|         mkdir -p "$sshdir" | ||||
|         chmod 700 "$sshdir" | ||||
|         chown -R "$user:" "$sshdir" | ||||
|     fi | ||||
|     local ak="$sshdir/authorized_keys" | ||||
|     if [ ! -f "$ak" ]; then | ||||
|         touch "$ak" | ||||
|         chown "$user:" "$ak" | ||||
|     fi | ||||
| 
 | ||||
|     local -a pks | ||||
|     local pk | ||||
|     array_from_lines pks "$pubkeys" | ||||
|     for pk in "${pks[@]}"; do | ||||
|         if ! grep -q "$pk" "$ak"; then | ||||
|             estep "Installation de la clé ${pk:0:20}... pour $user" | ||||
|             echo "$pk" >>"$ak" | ||||
|         fi | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| pkfile= | ||||
| pkstring= | ||||
| luser= | ||||
| host= | ||||
| tmproot= | ||||
| SSH= | ||||
| args=( | ||||
|     --help '$exit_with display_help' | ||||
|     -p:,--pkfile: pkfile= | ||||
|     -s:,--pkstring: pkstring= | ||||
|     -l,--luser luser=1 | ||||
|     -h:,-H:,--host: host= | ||||
|     -T:,--tmproot: tmproot= | ||||
|     -S:,--ssh: SSH= | ||||
| ) | ||||
| parse_args "$@"; set -- "${args[@]}" | ||||
| 
 | ||||
| user="$1" | ||||
| [ -n "$user" ] || die "Vous devez spécifier l'utilisateur à créer" | ||||
| 
 | ||||
| if [ -z "$pkstring" ]; then | ||||
|     if [ -z "$pkfile" ]; then | ||||
|         if [ -f ~/.ssh/id_rsa.pub ]; then pkfile=~/.ssh/id_rsa.pub | ||||
|         elif [ -f ~/.ssh/id_dsa.pub ]; then pkfile=~/.ssh/id_dsa.pub | ||||
|         fi | ||||
|     fi | ||||
|     if [ -f "$pkfile" ]; then pkstring="$(<"$pkfile")" | ||||
|     elif [ -n "$pkfile" ]; then die "$pkfile: fichier introuvable" | ||||
|     fi | ||||
| fi | ||||
| 
 | ||||
| if [ -z "$host" ]; then | ||||
|     # déploiement local | ||||
|     run_as_root ${pkstring:+-s "$pkstring"} ${luser:+-l} "$user" | ||||
|     create_user "$user" | ||||
|     [ -z "$luser" ] && init_sudoer "$user" | ||||
|     [ -n "$pkstring" ] && install_pubkeys "$user" "$pkstring" | ||||
|     exit 0 | ||||
| 
 | ||||
| else | ||||
|     # déploiement distant | ||||
|     if [ -n "$host" ]; then | ||||
|         splituserhost "$host" remoteuser host | ||||
|         [ -n "$remoteuser" ] || remoteuser=root | ||||
|     fi | ||||
|     if [ -n "$SSH" ]; then | ||||
|         ssh=("$SSH" -o StrictHostKeyChecking=no -o ConnectTimeout=2 -qt) | ||||
|         scp=(scp -S "$SSH" -o StrictHostKeyChecking=no -o ConnectTimeout=2 -q) | ||||
|     else | ||||
|         ssh=(ssh -o StrictHostKeyChecking=no -o ConnectTimeout=2 -qt) | ||||
|         scp=(scp -o StrictHostKeyChecking=no -o ConnectTimeout=2 -q) | ||||
|     fi | ||||
| 
 | ||||
|     ac_set_tmpdir workdir | ||||
|     mkdir "$workdir/lib" | ||||
|     ulibsync "$workdir/lib" | ||||
|     cp "$script" "$workdir" | ||||
|     echo "#!/bin/bash | ||||
| $(qvals "./$scriptname" ${pkstring:+-s "$pkstring"} ${luser:+-l} "$user")" >"$workdir/do_remote" | ||||
|     chmod +x "$workdir/do_remote" | ||||
| 
 | ||||
|     ac_set_tmpfile archive | ||||
|     archivename="$(basename "$archive")" | ||||
| 
 | ||||
|     "$scriptdir/mkusfx" --tmp-archive --bare -o "$archive" "$workdir" ./do_remote || die | ||||
| 
 | ||||
|     estep "Copie du script sur $remoteuser@$host" | ||||
|     "${scp[@]}" "$archive" "$remoteuser@$host:" || die | ||||
| 
 | ||||
|     estep "Exécution du script" | ||||
|     "${ssh[@]}" "$remoteuser@$host" "\ | ||||
| __estack=$(quoted_arg "$__estack") | ||||
| __tlevel=$(quoted_arg "$__tlevel") | ||||
| export __estack __tlevel | ||||
| ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG | ||||
| }$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"})" | ||||
|     r=$? | ||||
|     ac_clean "$workdir" | ||||
| 
 | ||||
|     exit $r | ||||
| fi | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user