Automatizzare smbpasswd da bash

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!

Condivido

Leave a comment