|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 4870
|
Domande su Bash Script, PostFix e crontab.
Ciao Ragazzi, avrei bisogno di alcuni chiarmenti e mi piacerebbe sapere cosa ne pensate del mio primo bash script
(non ci andate troppo pesanti) Allora mi è stato chiesto da un'ufficio di fare in modo che le passwords degli utenti samba (macchine windows) cambino ogni mese, io non posso ogni mese andare in questo ufficio a cambiare le passwords, incitato da Pardo in un altro 3ad mi sono scritto un piccolo script. Il seguente script genera passwords alfabetiche di 8 caratteri (minuscoli), le stampa tramite la stampante attaccata allla macchina linux (Debian) e le manda via e-mails all'amministratore dell'ufficio che le distribuirà ai dipendenti. Il tutto deve succedere una volta al mese (userò il crontab). Questo è lo script, premetto che gli utenti hanno tutti lo stesso nome e varia solo dal numero dal numero finale (Ufficio1, Ufficio2, Ufficio3, etc etc): Codice:
#!/bin/bash #************************************************# # passwords.sh # # scritto da Herod De Vil # # 17 Novembre 2005 # # # # Cambio passwords in modo generico # # agli utenti Samba # #************************************************# #Parametri LETTERE=8 MODULO=25 UTENTI=4 NOMEUTENTE=Ufficio DATA=$(date) MESECORRENTE=$(date +%B) ANNOCORRENTE=$(date +%Y) [email protected] [email protected] # pulitura schermo clear # Calcolo passwords for ((b=1; b <= $UTENTI; b++)) do password="" for ((a=1; a <= $LETTERE; a++)) do let "lettera = $RANDOM % $MODULO + 97" OCTAL=$(printf %o $lettera) RESULT=$(printf \\$OCTAL) password=$password$RESULT done passwords[$b]=$password smbpasswd -U $NOMEUTENTE$b -w $password #cambio password done # Scrittura delle passwords sul file passwords.txt testo='Passwords emesse il '$DATA' valide per tutto il mese corrente ('$MESECORRENTE' '$ANNOCORRENTE').\n' for ((b=1; b <= $UTENTI; b++)) do testo=$testo'------------------------------------\n' testo=$testo$NOMEUTENTE$b' = '${passwords[$b]}'\n' done testo=$testo'------------------------------------\n' echo -e $testo > passwords.txt # Stampa le passwords dalla stampante impostata lpr -T "Accounts Ufficio" passwords.txt # Elimina il file con le passwords rm passwords.txt # Invio e-mail con i codici echo -e $testo | mail -s "Accounts Ufficio" -b $BCC $TO # Messaggio di conferma echo 'Cambio effettuato '$MESECORRENTE' '$ANNOCORRENTE Il file passwords.sh ha i pemessi di esecuzione e lettura solo da root quindi con "visudo" ho aggiunto Codice:
Cmnd_Alias SCRIPT=/usr/local/bin/passwords.sh Server ALL=SCRIPT,NOPASSWD: ALL Codice:
30 11 1 * * sudo /usr/local/bin/passwords.sh Domande:
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Sulla 1) non so aiutarti, sulla 2) per inviare la mail solo in un giorno lavorativo devo scriverti un tuo script perchè il sistema non conosce il calendario delle festività italiane
Se ti accontenti di ogni primo lunedì del mese puoi inserire in crontab: 0 7 1-7 * * [ `/bin/date +%A` = Monday ] && /tuo/path/passwords.sh Ultima modifica di kingv : 19-11-2005 alle 18:37. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
Quote:
ad ogni modo per la generazione della password ti consiglio pwgen, così semplifichi molto lo script. ho scritto anch'io diversi script di shell e ti do' un consiglio: usa le funzioni e l'inclusione da file esterno per spezzare il codice ed aumentarne la leggibilità anche nel codice breve, ma che pensi possa crescere nel tempo. per quanto riguarda il problema 1 echo "pippo" | mail -a "From: [email protected]" -s "pluto" [email protected] problema 2: non dovrebbe sussistere, in quando il server si tiene tutto in coda (mail e stampa) e dovrebbe sputarlo fuori quando sente la connessione (al max aumenta il tempo di permanenza in coda di postfix). una soluzione che ho applicato in casi del genere è scegliere una macchina che è necessariamente accessa quando qualcuno è in ufficio, e implementare uno script di "ping di sopravvivenza": se non riesci a pingarla più di N volte la macchina linux va in shutdown (magari puoi aggiungere la condizione che sia una certa ora). se poi dal bios del PC imposti l'accensione alle 6/7 del mattino non si accorgono di nulla e così facendo hai allungato sensibilmente la vita di un povero server
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
per farti capire cosa intendevo prima, guarda questo:
quello che interessa di più, cioè il primo, si commenta praticamente da solo script vpnuptime Codice:
#!/bin/sh
. /etc/openvpn/tdbshtool
NOW=$(date +"%d-%m-%y;%H:%M")
case "$script_type" in
client-connect)
if ( ! inserttdb "$username" "$NOW" ); then {
INVPN=$(showtdb "$username")
UNKNOWN=$(date +"%d-%m-%y;scon")
logger -p daemon.info "openvpn-uptime $username;$INVPN;$UNKNOWN"
storetdb "$username" "$NOW"
}
fi
;;
client-disconnect)
INVPN=$(showtdb "$username")
logger -p daemon.info "openvpn-uptime $username;$INVPN;$NOW"
deletetdb "$username"
;;
*)
echo "Errore: devi chiamare questo script da OpenVPN"
exit 1
;;
esac
Codice:
TDBTOOL="/usr/bin/tdbtool"
DATABASE="/etc/openvpn/clients.tdb"
if [ ! -e "$TDBTOOL" ]; then {
echo "Cannot find tdbtool"
exit 1
}
fi
if [ ! -e "$DATABASE" ]; then {
echo "Cannot find database"
exit 1
}
fi
function showtdb() {
if ( echo "show $1" | tdbtool "$DATABASE" | grep failed 2> /dev/null &> /dev/null ); then {
return 1
}
else {
echo "show $1" | tdbtool "$DATABASE" | grep -A1 data | tail +2 | head -n1 | \
cut -d \* -f 2 | tr -d " "
return 0
}
fi
}
function inserttdb() {
if ( echo "insert $1 *$2" | tdbtool "$DATABASE" | grep failed 2> /dev/null &> /dev/null ); then {
return 1
}
else {
return 0
}
fi
}
function storetdb() {
if ( echo "store $1 *$2" | tdbtool "$DATABASE" | grep failed 2> /dev/null &> /dev/null ); then {
return 1
}
else {
return 0
}
fi
}
function deletetdb() {
if ( echo "delete $1" | tdbtool "$DATABASE" | grep failed 2> /dev/null &> /dev/null ); then {
return 1
}
else {
return 0
}
fi
}
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2002
Città: somewhere in Europe
Messaggi: 2554
|
Ciao,
se vuoi qu ci sono guide che sembrano ben fatte per shell e awk. Se devi trattare i file di testo ti consiglio awk che è + facile che la shell ed è molto C like. Lo script l'ho letto veloce ma tutte le varie funzioni per gestire stampanti e email non le conosco quindi non ti posso essere di aiuto, però il resto mi sembra scritto bene, anceh se non è "elegante" come magari si potrebbe fare è scritto in maniera comprensibile il che è mooolto meglio! |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 4870
|
Grazie ragazzi,
grazie per la mano che mi avete dato, visto che domani devo andare in fufficio a inserire lo script sul server penso che per il problema 2 opterò per la soluzione di kingv, il primo lunedì del mese. Codice:
30 11 1-7 * * [ `/bin/date +%A` = lunedì ] &&sudo /usr/local/bin/passwords.sh Quote:
Tornando invece al problema 1 anche scrivendo: Codice:
echo "pippo" | mail -a "From: [email protected]" -s "pluto" [email protected] Non compaiono neanche tra lo spam Avete qualche idea? Grazie ancora per l'aiuto. H2K Ultima modifica di Herod2k : 20-11-2005 alle 10:45. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
occhio, nal campo "giorno del mese" ci devi mettere 1-7, non 1-6.
Se il primo del mese è martedì il primo lunedì del mese è il 7 |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 4870
|
Quote:
è vero...ora edito.
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:27.











è vero...ora edito.








