Script bash de configuration réseau

Bonjour à tous!

Ayant eu des problèmes de configuration réseau lors de mes premières installations en mode commande, j’ai décidé d’écrire un petit script bash afin de rendre cette opération plus agréable. Le rendu me convient, mais, connaissant mon niveau en programmation, je doute (très) fortement qu’il soit optimisé. Les différents tests que j’ai effectués m’ont parus concluants (je vais continuer mes tests sous une machine virtuelle que je suis en train de préparer).

L’objectif de ce poste est d’améliorer ce script afin qu’il puisse être utilisé le plus simplement possible par ceux qui le voudront…

Ce script fait:

  • Configuration Ethernet en statique et DHCP, options choisies par le menu
  • Configuration Wifi en WEP et WPA en statique et en DHCP

Les fichiers tels que /etc/network/interface_wifi sont, vous l’aurez compris destinés à faire des tests pour ne pas bousiller ma configuration perso!

Ne soyez pas trop durs :slightly_smiling:
Désolé d’avance pour la longueur!

#!/bin/bash

#-------------------------------
#    Configuration du réseau
#-------------------------------
# Powered by Chr0me
# License GPL v3
clear
cat << EOF
--------------------------------------
 Configuration du réseau         
--------------------------------------

1. Configuration Ethernet
2. Configuration du Wifi
3. Quitter

EOF

	echo -n "Choix:"
#Saisie du choix par l'utilisateur
	read choix

## choix n°1 : configuration du réseau Ethernet en statique
## si choix = 1 alors passer au menu Ethernet

choix1()
{
	clear
cat << EOF
-------------------------------------
Configuration Ethernet
-------------------------------------

1. Statique
2. DHCP
3. Retour au menu principal

EOF
	echo -n "Choix:"
	read choix_eth

	choix_eth1()
	{	
		clear
cat << EOF
-------------------------------------
Configuration Ethernet
-------------------------------------

EOF
		echo -n "Nom de l'interface Ethernet:"
		read interface
		echo -n "Adresse IP:"
		read ip_add
		echo -n "Masque:"
		read netmask
		echo -n "Passerelle:"
		read gateway
		echo -n "Serveur DNS:"
		read nameserver

	## Affichage des paramètres dans le fichier de configuration

echo " 
## Configuration de $interface en mode Statique
auto $interface
iface $interface inet static
	address $ip_add
	netmask $netmask
	gateway $gateway
	dns-nameservers $nameserver" >> /etc/network/interfaces

	## Si la dernière commande est correctement exécutée, on affiche

		if [ $? = "0" ]; then
			echo "Les données de configuration ont été écrites avec succès"
			echo "Redémarrage du service..."
			sleep 1
		fi
	
	## On envoie également le DNS dans le resolv.conf

		echo $nameserver >> /etc/resolv.conf

	## On affiche le fichier créé (ou modifié)
		cat /etc/network/interfaces
		sleep 5
		$0
	}
	choix_eth2()
	{	
		clear
cat << EOF 
-----------------------------------
Configuration Ethernet       
-----------------------------------

EOF
		echo -n "Nom de l'interface Ethernet:"
		read interface

		echo " 
## Configuration de $interface en mode dynamique
auto $interface
iface $interface inet static
	address $ip_add
	netmask $netmask
	gateway $gateway
	dns-nameservers $nameserver" >> /etc/network/interfaces

	## Si la dernière commande est correctement exécutée, on affiche

		if [ $? = "0" ]; then
			echo "Les données de configuration ont été écrites avec succès"
			echo "Redémarrage du service..."
			sleep 1
			cat /etc/network/interfaces
			sleep 5
			$0
		fi
	}

	case $choix_eth in
		1) choix_eth1
		;;
		2) choix_eth2
		;;
		3) $0
		;; 
	esac
}

# On veut savoir si c'est en wep ou en WPA
# 1. WEP
# 2. WPA


# Tant que le choix n'est pas 3 : Quitter, 
# Affichage du menu
choix2()
{
	clear
cat << EOF
-----------------------------------
Configuration Wifi
-----------------------------------

1. WEP
2. WPA
3. Quitter

EOF
	echo -n "Choix:"
	#Saisie du choix par l'utilisateur
	read choix_wifi


		choix_wifi1()
		{
		#Menu de la configuration du wifi en WEP
			clear
cat << EOF
-----------------------------------
Configuration WEP
-----------------------------------

1. Statique
2. DHCP
3. Retour au menu principal

EOF
			echo -n "Choix:"
			read choix_wep
		
			# Si utilisateur choisi le 1 il passe en statique
		
			choix_wep1()
			{	
				clear
cat << EOF 
-----------------------------------
Configuration WEP
-----------------------------------

EOF
				# Saisie des informations relatives au réseau wifi
			
				echo -n "Nom de l'interface :"
        			read interface_wifi
        			echo -n "Adresse IP:"
        			read ip_add_wifi
        			echo -n "Masque:"
        			read netmask_wifi
        			echo -n "Passerelle:"
        			read gateway_wifi
        			echo -n "Serveur DNS:"
       				read nameserver_wifi
				echo -n "Nom de votre réseau Wifi:"
				read essid
				echo -n "Clé WEP de votre Box:"
				read wifi_key

				#Affichage des paramètres dans le fichier de configuration Wifi

				echo " 
## Configuration de $interface_wifi en mode Statique
auto $interface_wifi
iface $interface_wifi inet static
	address $ip_add_wifi
	netmask $netmask_wifi
	gateway $gateway_wifi
	dns-nameservers $nameserver_wifi
	wireless-essid $essid   
    	wireless-key $wifi_key " >> /etc/network/interfaces

				## Si la dernière commande est correctement exécutée, on affiche

				if [ $? = "0" ]; then
					echo "Les données de configuration ont été écrites avec succès"
					echo "Redémarrage du service..."
					/etc/init.d/networking restart
					sleep 1
				fi
	
				## On envoie également le DNS dans le resolv.conf

				echo $nameserver >> /etc/resolv_wifi
				cat /etc/network/interfaces
				sleep 5
				}


			choix_wep2()
			{
				clear
cat << EOF 
-----------------------------------
Configuration WEP
-----------------------------------

EOF
				echo -n "Nom de l'interface :"
        			read interface_wifi
				echo -n "Nom de votre réseau Wifi:"
				read essid
				echo -n "Clé WEP de votre Box:"
				read wifi_key

## Configuration de $interface en mode dynamique

echo " 
## Configuration de $interface en mode dynamique
auto $interface_wifi
iface $interface_wifi inet dhcp
	wireless-essid $essid   
    	wireless-key $wifi_key" >> /etc/network/interfaces

				## Si la dernière commande est correctement exécutée, on affiche

				if [ $? = "0" ]; then
					echo "Les données de configuration ont été écrites avec succès"
					echo "Redémarrage du service..."
					/etc/init.d/networking restart
					sleep 1
				fi
				echo $nameserver >> /etc/resolv
				cat /etc/network/interfaces
				sleep 5

			}
			case $choix_wep in
				1) choix_wep1
				;;
				2) choix_wep2
				;;
				3) $0
			esac
			#fi

# Selon le choix du menu, on éxecute le choix 1 ou le choix 2

		}
		choix_wifi2()
		{
		clear
cat << EOF
-----------------------------------
Configuration WPA
-----------------------------------

1. Statique
2. DHCP
3. Retour au menu principal

EOF
			echo -n "Choix:"
			read choix_wpa

			choix_wpa1()
			{
				clear
cat << EOF
-----------------------------------
Configuration WPA
-----------------------------------

EOF
				echo -n "Nom de l'interface Wifi:"
        			read interface_wifi
        			echo -n "Adresse IP:"
        			read ip_add_wifi
        			echo -n "Masque:"
        			read netmask_wifi
        			echo -n "Passerelle:"
        			read gateway_wifi
        			echo -n "Serveur DNS:"
       				read nameserver_wifi
				echo -n "Télecharger le paquet (nécessite le mot de passe sudo) [Y/n]?"
				read rep
				# Demande pour le téléchargement du paquet avec sudo : Ce test ne fonctionne apparement pas...
				if [ $rep = "" or "Y" or "y"  ]; then
					sudo apt-get install wpasupplicant
				fi

				echo -n "Nom de votre réseau Wifi (Attention à la casse!):"
				read essid
				echo -n "Quel est le type de chiffrement (PSK - TKIP - AES):"
				read chiffrement
				echo -n "Indiquez votre clé WPA (Attention à la casse!):"
				read wpa_key
echo " 
## Configuration de $interface en mode statique
auto $interface_wifi
iface $interface_wifi inet dhcp
	wireless-essid $essid   
    	wireless-key $wifi_key" >> /etc/network/interfaces
				
				
echo "ctrl_interface=/var/run/wpa_supplicant   
eapol_version=1   
ap_scan=1   
fast_reauth=1   

network={   
    ssid="$essid"   
    scan_ssid=1   
    proto=WPA   
    key_mgmt=WPA-$chiffrement   
    psk="$wpa_key"  
    priority=5   
}" >> /etc/wpa_supplicant/wpa_supplicant.conf
				chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf
				
				if [ $? = "0" ]; then
					echo "Les données de configuration ont été écrites avec succès"
					echo "Redémarrage du service..."
					/etc/init.d/networking restart
					sleep 1
				else
					echo "Les données n'ont pas pu être écrites"
				fi
			}
			choix_wpa2()
			{
				clear
cat << EOF
-----------------------------------
Configuration WPA
-----------------------------------

EOF
				echo -n "Télecharger le paquet (nécessite le mot de passe sudo) [Y/n]?"
				read rep
				# Demande pour le téléchargement du paquet avec sudo
				if [ $rep = ""]; then
					sudo apt-get install wpasupplicant
				fi

				echo -n "Nom de votre réseau Wifi (Attention à la casse!):"
				read essid
				echo -n "Quel est le type de chiffrement (PSK - TKIP - AES):"
				read chiffrement
				echo -n "Indiquez votre clé WPA (Attention à la casse!):"
				read wpa_key

## Inscription des paramètres dans le fichier interfaces_wifi				
echo " 
## Configuration de $interface en mode statique
auto $interface_wifi
iface $interface_wifi inet dhcp
	wireless-essid $essid   
    	wireless-key $wifi_key" >> /etc/network/interfaces

## Inscription des paramètres dans le fichier wpa_supplicant.test pour le paramétrage de l'AP				
echo "ctrl_interface=/var/run/wpa_supplicant   
eapol_version=1   
ap_scan=1   
fast_reauth=1   

network={   
    ssid="$essid"   
    scan_ssid=1   
    proto=WPA   
    key_mgmt=WPA-$chiffrement   
    psk="$wpa_key"  
    priority=5   
}" >> /etc/wpa_supplicant/wpa_supplicant.conf
				chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf	
				if [ $? = "0" ]; then
					echo "Les données de configuration ont été écrites avec succès"
					echo "Redémarrage du service..."
					/etc/init.d/networking restart
					sleep 1
				else
					echo "Les données n'ont pas pu être écrites"
				fi
			}
			case $choix_wpa in
				1) choix_wpa1
				;;
				2) choix_wpa2
				;;
				3) $0
				;;
			esac
		
		}
		case $choix_wifi in
			1) choix_wifi1
			;;
			2) choix_wifi2
			;;
			3) $0
			;;
		esac	
}

case $choix in
	1) choix1
	;;
	2) choix2
	;;
esac	

Le 01/08/11 :

  • modification des echo remplacés par EOF
  • ajout du chmod 600 au wpa_supplicant.conf

Pour éviter un désagrément à ceux qui l’essaieront en le copiant-collant
la première ligne doit être changée en #!/bin/bashcar#/bin/bash!risque de ne pas mener bien loin.
:wink:

[quote=“Chr0my”]## On envoie également le DNS dans le resolv.conf

	echo $nameserver >> /etc/resolv[b]1[/b].conf[/quote]Nonobstant le fait qu'écrire directement dans /etc/reso[b]l[/b]v.conf n'est pas la bonne manière de faire,

(dhclient ou resolvconf écriront par dessus si l’utilisateur fait appel à eux ) tu auras remarqué la faute de frappe … pourtant le 1 et le l ne sont pas si proche sur le clavier :mrgreen:

Sinon, tu m’apprends quelquechose, quand tu /etc/init.d/restart
tous les fichiers présent dans /etc/network sont pris en compte ?

Bonsoir!

En ce qui concerne le #/bin/bash!: pourrais-tu m’expliquer les conséquences de cette faute? Parce que je l’ai écrite de cette façon et je n’ai pas rencontré d’erreurs particulières? Merci!

Concernant le /etc/init.d/restart… Tu comprendras que c’est une erreur de frappe et que:

est ce que je voulais noter :wink:

Comment puis-je faire différement?

Par contre, je n’ai pas compris :

Si c’est par rapport au 1 que je mets derrière, c’est fait exprès… il faut modifier les noms car ce sont comme je l’ai précisé des noms factices destinés à faire des tests (sinon je n’ai toujours pas compris ^^)

[quote=“Chr0my”]Bonsoir!

En ce qui concerne le #/bin/bash!: pourrais-tu m’expliquer les conséquences de cette faute? Parce que je l’ai écrite de cette façon et je n’ai pas rencontré d’erreurs particulières? Merci![/quote]J’ai parlé trop vite, j’ai essayé aussi et ça fonctionne …
J’avoue que j’aurais jamais cru et que j’étais même plutôt sûr de moi …

[quote=“Chr0my”]Concernant le /etc/init.d/restart… Tu comprendras que c’est une erreur de frappe et que:

est ce que je voulais noter :wink:[/quote]C’est d’ailleurs ce tu as fait …
C’est moi qui a écrit /etc/init.d/restart. ( eh oui j’ai mangé un mot )

Comment puis-je faire différement?[/quote]tu écris dans /etc/resolv.conf.tail par exemple
et tu resolvconf -a $interface < /etc/resolv.conf.tail

Par contre, je n’ai pas compris :

Si c’est par rapport au 1 que je mets derrière, c’est fait exprès… il faut modifier les noms car ce sont comme je l’ai précisé des noms factices destinés à faire des tests (sinon je n’ai toujours pas compris ^^)[/quote]Je n’avais pas lu ta précision, par contre mettre des noms de fichiers bidons,
ça se conçoit quand tu testes mais une fois que tu rends le script public
c’est plus vraiment nécessaire de laisser ça comme ça …
Ça va plutôt emmerder ceux qui testeront ton script qu’autre chose
surtout qu’ils sont disséminés partout dans le script,
tu les aurais mis dans une variable au début,
ça aurait été plus simple pour tout le monde.

Bonsoir,

[quote=“eol”][quote=“Chr0my”]Bonsoir!

En ce qui concerne le #/bin/bash!: pourrais-tu m’expliquer les conséquences de cette faute? Parce que je l’ai écrite de cette façon et je n’ai pas rencontré d’erreurs particulières? Merci![/quote]J’ai parlé trop vite, j’ai essayé aussi et ça fonctionne …
[/quote]

en fait cette ligne n’est pas considérée comme le shebang (car le ! ne se trouve pas juste après le #) mais comme un commentaire. de ce fait, l’interpréteur utilisé est celui de l’environnement d’exécution.

@eol: Désolé pour les noms de fichiers bidons, c’est vrai que je n’avais pas réfléchis à ça. Je l’éditerais et remettrais les bons noms dans peu de temps.
Je vais tester ta méthode pour le resolvconf (qui n’avait pas l’air d’être installé).

@Totor: merci pour la précision, je comprends mieux!

EDIT: J’ai modifié les noms des fichiers… S’il reste des coquille que je n’aurais pas vu dites le moi

[quote=“Chr0my”]Je vais tester ta méthode pour le resolvconf (qui n’avait pas l’air d’être installé).[/quote]Je viens d’aller voir, et de fait resolvconf n’est pas indispensable au système.
Et vu qu’apparement aucun paquet installé en dépend -> purge.

A noter qu’en l’installant ça m’a dégagé mon resolv.conf (un reboot a corrigé le problème).
Du coup, retour à la case départ :slightly_smiling:

Tiens, c’est marrant, t’as fait une bidouille que j’avais failli faire:

echo "-----------------------------------" echo " Configuration WEP " echo "-----------------------------------" echo ""
Pour sauter une ligne.

Tu peux éclaircir certains de tes echo en les remplaçant la commande printf en utilisant le caractère d’échappement \n pour aller à la ligne.

Ce qui donnerait:

echo "-----------------------------------" echo " Configuration WEP " printf %b "-----------------------------------\n\n" # On met deux \n, un pour aller à ligne suivante, et un pour en sauter une autre et le %b l'empêche de traiter les tirests comme des options

On peut même pousser le vice:

Pour avoir tout sur une ligne, mais je ne sais pas si c’est très lisible…

Ou echo -n pour rester sur des outils plus simples.

Bonjour,

autant faire simple :

Maintenant :

echo "-----------------------------------"
echo "        Configuration WEP          "
echo "-----------------------------------"
echo ""

à remplacer par:

cat <<EOF
-----------------------------------
        Configuration WEP          
-----------------------------------

EOF

joli script, quelques suggestions tout de même :slightly_smiling:

pour le wifi j’ajouterais un changement des permissions du fichier /etc/wpa_supplicant/wpa_supplicant.conf en 600

Ensuite me connectant souvent en wifi avec un laptpop à divers endroits j’aime bien la possibilité de nommer les interfaces wifi-maison, wifi-travail, etc… et de faire un ifup wlan0=wifi-maison.

En outre, le script pourrais envisager l’ajout de plus d’interfaces mobiles ou filaire d’ailleurs et puis utiliser mapping pour tester celle qui va bien, enfin ce ne sont que des idées :slightly_smiling:

Bonjour à tous!

Merci pour vos conseils et vos idées…
Je suis actuellement en vacances donc autant dire que j’ai la tête à autre chose en ce moment :dance: . Je me pencherais dessus à mon retour, et éditerais les modifications.

Courage à ceux qui bossent :slightly_smiling:

Bon, je suis de retour!

@Totor: Pour le EOF, je ne sais pas si j’ai fait correctement car lorsque j’exécute le script, il ne fait que me l’afficher. Je pense simplement modifier les [echo “”] en [echo]. Je trouve ça plus lisible… :neutral_face:

[quote=“euridice”]joli script, quelques suggestions tout de même :slightly_smiling:

pour le wifi j’ajouterais un changement des permissions du fichier /etc/wpa_supplicant/wpa_supplicant.conf en 600[/quote]
Est-ce vraiment nécessaire?

Je suis d’accord avec toi mais je ne sais toujours pas comment créer ces profils: une explication est la bienvenue!

Je n’ai pas trop compris :S

le 2nd EOF est-il bien en tout début de ligne ?

Bien vu, le problème venait en effet de l’espace que j’avais mis avant. Je vais modifier ça!

Modif effectuées.
Petite question: le fait d’utiliser cat << EOF est moins gourmand qu’un echo ou qu’un print?

[quote=“Chr0my”]Modif effectuées.
Petite question: le fait d’utiliser cat << EOF est moins gourmand qu’un echo ou qu’un print?[/quote]
Non. Mais il est moins gourmand que 5 ou 6 echo/print.

En effet, juste logique… :023