Sarà capitato anche a voi – di avere una musica in testa… – di dover ripristinare un certo numero di utenti Samba dopo l’upgrade di un server o la migrazione da un server ad un altro. Ho trovato un vecchio script che fa tutto il lavoro sporco caricando da un file di testo l’elenco degli utenti da ricreare con le relative password.
Il suo funzionamento è semplicissimo: si tratta in poche parole di una manciata di righe di bash che automatizzano l’interazione con il comando smbpasswd.
Lo script si compone di un primo eseguibile che ammette la sintassi seguente:
multi_smbpasswd.sh -o [add/del] -f [nome del file]
In pratica, per ricreare tutti gli utenti di Samba elencati nel file di configurazione utenti.conf:
multi_smbpasswd.sh -o add -f utenti.conf
Per eliminare tutti gli utenti di Samba elencati nel file di configurazione utenti.conf:
multi_smbpasswd.sh -o del -f utenti.conf
Ecco il codice di multi_smbpasswd.sh:
#!/bin/bash
##########################################################
## This script is here to make adding/subtracting users ##
## to the smbpasswd file easyer etc. ##
##########################################################
NO_ARGS=2
E_OPTERROR=65
operation=0
# 1 = add
# 2 = del
# 0 = error.
fillel=0
# 1 = good file and file location.
# 0 = error
#########################################################
## Parameters: ##
## -o [options] = The operation to preform. Options are##
## as follows: ##
## add = add users to the system ##
## del = delete users from the system. ##
## -f [file_location] = The file that the user names ##
## are stored in. must provide ##
## the compleate location of the ##
## file. ##
#########################################################
#protect outselfs from passing nothing to the script.
if [ "$#" -eq "$NO_ARGS" ]
then #script needs at least 3 options passed to it, otherwise error out and do nothing.
echo "Usage: $0 -[switch] [option/file_location]"
exit $E_OPTERROR
fi
while getopts o:f: Option
do
case "$Option" in
o)
#check the option and fill the operation var.
if [ "$OPTARG" == "add" ]
then
#we are going to add the users.
operation=1
elif [ "$OPTARG" == "del" ]
then
#we are deleting the users.
operation=2
else
#error out, cause they didn't pass the right option.
operation=0
echo "Invaild operation option!"
exit $E_OPTERROR
fi
;;
f)
#check the option to see if the file exsists and that it is none zero.
if [ -f "$OPTARG" ]
then
if [ -s "$OPTARG" ]
then
filel=1
filelocation="$OPTARG"
else
filel=0
echo "File is of zero length! You need to have a list of users in the file!"
exit $E_OPTERROR
fi
else
filel=0
echo "File isn't there! You must provide a valid file location!"
exit $E_OPTERROR
fi
;;
*)
break
;;
esac
done
shift $(($OPTIND - 1))
if [ $operation == 1 ]
then
#we are adding the users.
for i in $(cat "$filelocation")
do
username=$(echo "$i" | cut -d':' -f1)
password=$(echo "$i" | cut -d':' -f2)
#create a new unix user before smbpasswd
useradd $username
smb-passwd-add $username $password
done
elif [ $operation == 2 ]
then
#we are deleting the users out of the system.
for i in $(cat "$filelocation")
do
username=$(echo "$i" | cut -d':' -f1)
#remove the unix user before smbpasswd
userdel $username
smbpasswd -x $username
done
fi
exit 0
Non è tutto però. Perché possa funzionare lo script richiama una procedura esterna altrettanto semplice che si occupa di immettere i valori prelevati dal file di configurazione nello standard input di smbpasswd. Ecco il codice dello script smb-passwd-add:
#!/usr/bin/expect --
# wrapper to make passwd(1) be non-interactive
# username is passed as 1st arg, passwd as 2nd
# Executable only by root
set password [lindex $argv 1]
spawn /usr/bin/smbpasswd -a [lindex $argv 0]
expect "password:"
send "$passwordr"
expect "password:"
send "$passwordr"
expect eof
Attenzione!!! Come avete notato questo secondo script si basa su expect, che va quindi installato se volete che funzioni.
Infine, ecco un esempio del file utenti.conf:
utente1:wfwiourfhowirf
utente2:eiuewhifuhwef
utente3:dkjfwskfjhwekj
utente4:woeifjwoerifffj
L’originale si trova a questo indirizzo:
https://www.programmingforums.org/thread6522.html
Ho aggiunto solo un paio di righe per una sommaria sincronizzazione tra utenti Samba e utenti unix.
Spero vi possa servire!