Pour mon problème, il faut que j'utilise "time" qui permet de calculer le temps d'éxécution d'un processus. Seulement, j'ai toujours mon problème incompréhensible avec le :
instructions << LISTE
do 1
do 2
LISTE
Dés que je met ça dans le script, ça merde en me faisant une erreur en fin de fichier :
./bench2: line 224: syntax error: unexpected end of file
Je ne vois pas de où ça peut venir, help !
Voici le script entier, le passage problématique se trouvant dans la fonction "Msmb" (mesure future avec smbclient), ici en gras :
#!/bin/bash
# bash script - Fedora Core 5
clear
# Localisation Fr
export LC_ALL="fr_FR.utf8"
export LESSCHARSET="latin1"
# Déclaration de variables
ip=$1
# Message d'indication si aucun paramètre
if [ $# != 1 ];
then
clear
echo "Veuillez entrer un paramètre."
echo "Utilisation : $(basename $0) [IP du serveur]"
echo "---------------------------------------------------------------"
exit 0
fi
# Utilise le retour de la fonction testant la validité de l'IP
function wrong {
echo "Notation décimale IPv4 requise."
exit 0
}
# Test de validité IPv4 de l'adresse entrée (expression régulière)
function isIPv4 {
if [ $# = 1 ]
then
printf $1 | grep -Eq '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)$'
return $?
else
return 2
fi
}
isIPv4 $ip && echo "IP validée." || wrong
# Récupération de l'ip, du masque de sous-réseau et de l'adresse de broadcast de l'hôte
function hostip {
way=$1 #chemin de ifconfig ('sbin/ifconfig')
eth=$2 #numéro d'interface ('eth0')
for i in $(seq 4)
do
mask[$i]="$($way $eth|grep Masque|cut -d ':' -f4|cut -d '.' -f$i)"
octet[$i]="$($way $eth|grep Masque|cut -d ':' -f2|cut -d '.' -f$i|cut -d ' ' -f1)"
done
# Variable donnant l'IP de l'hôte
adress=${octet[1]}"."${octet[2]}"."${octet[3]}"."${octet[4]}
# Variable donnant le masque de sous-réseau
subnet=${mask[1]}"."${mask[2]}"."${mask[3]}"."${mask[4]}
# Variable donnant l'adresse du réseau
network=$[${mask[1]} & ${octet[1]}]"."$[${mask[2]} & ${octet[2]}]"."$[${mask[3]} & ${octet[3]}]"."$[${mask[4]} & ${octet[4]}]
echo "IP de l'hôte : $adress"
echo "Sous-réseau : $subnet"
echo "Réseau : $network"
}
# Création du log et aiguillage vers le type de mesure adéquat.
function mesure () {
# Indication à l'écran pour patienter
echo "Veuillez patienter svp..."
# Création du nom de fichier log
log=$1
# Liste la date et l'heure
echo "---------------------------------------------------------------" > $log
echo $(date) >> $log
echo "---------------------------------------------------------------" >> $log
echo "" >> $log
# Ajoute le nom d'hôte et l'adresse IP de l'interface 0
echo "Nom de l'hôte : $(hostname)" >> $log
hostip '/sbin/ifconfig' 'eth0' >> $log
echo "" >> $log
# Ligne de séparation avant mesures
echo "---------------------------------------------------------------" >> $log
echo "" >> $log
function Mncp(){
# monter clientncpfs
# time cp
echo "netware core protocol"
}
function Msmb(){
# utiliser clientsmb
# time cp
echo "samba"
[b]smbclient -I $ip \atelierFTP nopass << "EOF"
get fake
exit
EOF[/b]
rm fake
}
# Mesures d'un téléchargement FTP
function Mftp(){
wget -r -4 -a $log --progress=dot:mega --proxy=off --cache=off --no-passive-ftp --user anonymous --password anonymous@test.com ftp://$ip/fake
rm -r $ip
}
# Mesures d'un téléchargement HTTP
function Mhttp(){
wget -r -4 -a $log --progress=dot:mega --proxy=off --cache=off --no-dns --user anonymous --password anonymous@test.com http://$ip/fake
rm -r $ip
}
# Mesures d'un téléchargement HTTP via un proxy
function Mhttpp(){
export http_proxy="http://10.1.1.3:8080" #Utilisation de la variable d'environnement
wget -r -4 -a $log --progress=dot:mega --proxy=on --cache=off --no-dns --user anonymous --password anonymous@test.com http://$ip/fake
rm -r $ip
}
# Mesures en client/serveur iperf
function Miperf(){
iperf -c $ip -P 0 -i 1 -f k -t 30 >> $log # sur 30 sec en TCP, 1 mesure/sec.
echo "" >> $log
}
# Mesures complètes, une à une.
function Mall(){
function boucle(){
case $1 in
1) nom="wget FTP" mesure="Mftp";;
2) nom="wget HTTP" mesure="Mhttp";;
3) nom="wget HTTP avec le proxy" mesure="Mhttpp";;
4) nom="client iperf" mesure="Miperf";;
5) nom="partage NPC" mesure="Mnpc";;
6) nom="partage SMB" mesure="Msmb";;
esac
echo "" >> $log
echo "Mesure $1 : $nom"
echo "---------------------------------------------------------------" >> $log
echo "Mesure $1 : $nom" >> $log
echo "---------------------------------------------------------------" >> $log
$mesure
}
for k in $(seq 6)
do
boucle $k
echo "" >> $log
done
}
# Test sur le type de log pour lancer les instructions appropriées
M${log#log}
# Instructions pour indiquer la fin des mesures dans le log
echo "---------------------------------------------------------------" >> $log
echo "Fin du script $(basename $0)" >> $log
echo "---------------------------------------------------------------" >> $log
}
# Libre choix : visualisation immédiate du log (ou non)
function lire(){
echo ""
while test "$input" != [yYnN]
do
echo "Souhaitez-vous visualiser le fichier $log ? [y/n]"
read input
case "$input" in
[yY])
less $log
echo "---------------------------------------------------------------"
echo "Les résultats sont dans le fichier '$(pwd)/$log'"
echo "---------------------------------------------------------------"
exit 0;;
[nN])
echo "---------------------------------------------------------------"
echo "Les résultats sont dans le fichier '$(pwd)/$log'"
echo "---------------------------------------------------------------"
exit 0;;
esac
done
}
# Gestion du menu de choix pour le type de mesures à effectuer
function menu(){
clear
echo "---------------------------------------------------------------"
echo "| Choix du protocole de test |"
echo "---------------------------------------------------------------"
echo "Appuyez sur une touche, puis validez. Touche [8] pour quitter."
echo ""
select j in 'HTTP' 'HTTP+proxy' 'FTP' 'IPERF' 'NCP' 'SMB' 'ALL' 'QUIT'
do
case $j in
FTP|HTTP|IPERF|ALL|NCP|SMB)
mesure log$(echo $j|tr '[A-Z]' '[a-z]')
echo "Mesures terminées. Bonne journée !"
lire
exit 0;;
HTTP+proxy)
mesure loghttpp
echo "Mesures terminées. Bonne journée !"
lire
exit 0;;
QUIT)
clear
echo "Script terminé. Bonne journée."
exit 0;;
*)
echo "Veuillez entrer un chiffre entre 1 et 7. Merci."
echo "Touche '8' pour quitter, 'ctrl+d' pour interrompre";;
esac
done
}
menu
Chose assez drôle, si je mets mes commandes dans un fichier, et que je fais une redirection simple, de cette manière :
fichier "liste" :
-------------------------
get fake
exit
-------------------------
Dans le script :
-------------------------
commande < liste
-------------------------
Là, ça marche sans erreurs.
Mise à part cette erreur (horreur ?), que je peux contourner, est-il possible de récupérer la sortie de smbclient pour le mettre dans un "log" ? j'ai regardé les commandes de smbclient, je n'ai rien trouvé de valable (style append), et une double redirection vers mon log ne fonctionne pas.
Merci.