Pour les scripts : c'est ici

[quote=“BBT1”]Quelques remarques :

[quote=“Rantanplan aussi !”]
… pour economiser de la place …[/quote]http://www.debian-fr.org/pour-les-scripts-c-est-ici-t3548-250.html#p364870 [/quote]

Merci pour tes remarques ( elles sont bien utiles !) , j’étudie ça et je te dis ce que j’en pense, même si je suis déjà convaincu du bien fondé de 96,72% :mrgreen: d’entres elles, suite à une lecture rapide, sauf pour la strucure if … fi dans le cas de trés peu d’instructions :think: , car je trouve que dans ce cas précis elle alourdie au contraire la lecture et ne facilite donc pas la compréhension du script.

Maintenant peut-être que des if-fi systématiques sont mieux pour des débutants,(edit:ou au contraire pour les “mangeurs” de code) je ne sais pas :confused: , mais moi je prefére de loin

[ condition ] && commande

à :

if condition ; then
commande
if

Quand il n’y a qu’une/deux commandes comme c’est le cas dans ce script

A part ça j’ai “survolé” pas mal de scripts intéressant + haut, faut que je vois certains dans le détails ya du job mais des récompenses à la clé je penses

Sinon j’aime bien les dragons moi ! :023 :mrgreen: :stuck_out_tongue: )

[quote=“BBT1”]Tu peux mettre la redirection avant ou après la commande
ex

est équivalent à

Ça je savais pas , thanks :stuck_out_tongue:

[quote=“Rantanplan aussi !”]Maintenant peut-être que des if-fi systématiques sont mieux pour des débutants, je ne sais pas :confused: , mais moi je prefére de loin

[ condition ] && commande

à :

if condition ; then commande if [/quote]

Je dis pas le contraire mais j’aime aussi la règle des 80 caractères (à l’ancienne quoi). D’autre part, quand tu parcours de grandes quantités de code, c’est pas mal de saisir la structure avec une lecture verticale, et donc proche de la marge (mais cette opinion est assez personelle).

Enfin pour ce cas là c’est vraiment une question de feeling.

Ouais.
C’est cool les dragons.

[quote=“BBT1”][quote=“Rantanplan aussi !”]Maintenant peut-être que des if-fi systématiques sont mieux pour des débutants, je ne sais pas :confused: , mais moi je prefére de loin

[ condition ] && commande

à :

if condition ; then commande [color=#0000FF][b]if[/b][/color] [/quote]

Je dis pas le contraire mais j’aime aussi la règle des 80 caractères (à l’ancienne quoi). D’autre part, quand tu parcours de grandes quantités de code, c’est pas mal de saisir la structure avec une lecture verticale, et donc proche de la marge (mais cette opinion est assez personelle).

Enfin pour ce cas là c’est vraiment une question de feeling.

Ouais.
C’est cool les dragons.[/quote]
Moi aussi je préfère la seconde forme mais je touve que ça fonctionne mieux avec “fi” :laughing:
Je pousse même le vice à déployer complètement :

if condition then commande fi

@ BBT1

Oui, je suis assez d’accord avec ce que tu dis sur les habitudes et les règles, tu as bien fait de me dire ta façon de penser, que le script soit petit ou pas, ça donne un cadre (argumenté) plus général pour s’aventurer à écrire des scripts plus ambitieux.

J’ai fait un copier / coller de ton script aprés avoir sauvegardé le mien et les rep/fichier associés, puis j’ai testé.

Il a marché du premier coup :023 . J’ai ensuite supprimé le ${fichier_ip} pour faire des tests ( c’est incontournable à mon sens, sinon …) et ça a planté sur le :

derniere_ip=$(tail -1 ~/${rep}/${fichier_ip}|cut -d' ' -f5)

normal, puisque le fichier n’existe pas.

J’ai modifié cette ligne en conséquence tout conservant l’esprit de tes modifs (parce qu’il est bon) comme ceci :

derniere_ip=$(tail -1 ~/${rep}/${fichier_ip} 2>/dev/null | sed 's/^.*[[:blank:]]\+//')

(j’ai aussi été obligé de remplacer le cut par un sed parce que le cut suivant ne fonctionne pas :

derniere_ip=$(tail -1 ~/${rep}/${fichier_ip} 2>/dev/null | cut -d'\t ' -f2)

mais ça m’est égal le sed me convient parfaitement. )

Donc pour résumer, la seule modif sur tes modifs est ceci :

derniere_ip=$(tail -1 ~/${rep}/${fichier_ip} 2>/dev/null | sed 's/^.*[[:blank:]]\+//')

J’ai aussi fait le test de supprimer le ${rep} --> pas de pb

J’ai testé tes :

echo "122.34.2" | egrep  '^([[:digit:]]+\.){3}[[:digit:]]+$';echo $?
1
echo "122.34.2.1" | egrep  '^([[:digit:]]+\.){3}[[:digit:]]+$';echo $?
122.34.2.1
0

directement sur le shell --> impeccable

Je ne connaissais pas cette manière de multiplier un test comme ça {3}, c’est bien commode … sinon curl je connaissais pas vraiment ( faut que j’approfondisse ya de la matière )

Et oui ton :

sed 's|^.*>\(.*\)</td>$|\1|'

est bien joli par rapport au mien ( et beaucoup + lisible, pourtant je connaissais cette possibilité de changer / en | par exemple mais j’utilisais jamais ça ?)

Trés juste aussi la redirection des echo d’erreurs >&2 , en effet, si l’on redirige la sortie std du script, les erreurs iront tout de même sur la sortie d’erreur, ce qui n’aurait pas été le cas dans la première version que j’ai donné.

Trés bien aussi la modif des options de wget pour pouvoir filtrer directement sur stdout sans passer par un fichier intermédiaire (source de problèmes lors de sa suppression).

Voilà. Je laisse tourner tranquille 1 semaine et je modifierai mon post initial en conséquence. Edit: post initial modifié le 19/11/2011

Franchement BBT1 merci bien pour ce cours gratuit.

Yes cool are the Dragons :023

Notes : en fait c’est suite à la reception du mail suivant que j’ai eu l’idée de ce script, extrait :

[quote=“SECUVAD”][…] Nous vous rappelons quelques éléments techniques de votre connexion :

* le 26/06/2007 à 13:58:00 : Acceptation des CGV depuis l'adresse 'www.xxx.yyy.zzz'
* le 27/06/2010 à 00:02:00 : Reconduction Abo mensuel à 29,90€/mois après offre 1€ les 7 jours du 19/06/10 pour un montant de 29.90 EUR depuis l'adresse 'www.xxx.yyy.zzz'

À ce jour, vous êtes donc redevable à l’égard de la société SARL INTERNET MACHIN TRUC BIDULE d’une somme totale de :

  • Principal : 29.00 EUR

En conséquence, et en application des dispositions de l’article 1139 du Code civil, nous vous mettons en demeure de régler sans délai la somme de 29.00 EUR.
[…]
[/quote]
On voit bien dans cet extrait qu’ils disent que j’avais la même IP à 3 ans d’interval (j’ai masqué les IP parce que c’est pas vraiment utile, mais c’était les mêmes), ce qui est débile avec l’offre Orange que j’avais.( j’ai changé le nom précis de la société en MACHIN TRUC BIBULE parce que bon …)

Je me suis fait avoir, j’ai payé, mais on ne pourra plus m’affirmer que tel jour j’avais telle IP parce que si c’est pas vrai … ça va pas ce passer comme ça :smiling_imp:

[quote=“ricardo”][quote=“BBT1”][quote=“Rantanplan aussi !”]Maintenant peut-être que des if-fi systématiques sont mieux pour des débutants, je ne sais pas :confused: , mais moi je prefére de loin

[ condition ] && commande

à :

if condition ; then commande [color=#0000FF][b]if[/b][/color] [/quote]

Je dis pas le contraire mais j’aime aussi la règle des 80 caractères (à l’ancienne quoi). D’autre part, quand tu parcours de grandes quantités de code, c’est pas mal de saisir la structure avec une lecture verticale, et donc proche de la marge (mais cette opinion est assez personelle).

Enfin pour ce cas là c’est vraiment une question de feeling.

Ouais.
C’est cool les dragons.[/quote]
Moi aussi je préfère la seconde forme mais je touve que ça fonctionne mieux avec “fi” :laughing:
Je pousse même le vice à déployer complètement :

if condition then commande fi[/quote]

Yes Ricardo ! :smiley: ,

J’avais pas vu, je comprenais pas ton message depuis hier soir! ça y est j’ai compris :unamused: :stuck_out_tongue: !

[quote=“ricardo”]Moi aussi je préfère la seconde forme mais je touve que ça fonctionne mieux avec “fi” :laughing:
Je pousse même le vice à déployer complètement :

if condition then commande fi[/quote]

Bof. Le then tout seul sur sa ligne n’apporte pas grand chose, il est sous-entendu par le if et encombre le bloc de commandes déjà facilement repérable par l’indentation de la ligne.

Pour moi, c’est une ligne perdue.

[quote=“Rantanplan aussi !”]J’ai ensuite supprimé le ${fichier_ip} pour faire des tests ( c’est incontournable à mon sens, sinon …) et ça a planté sur le :

derniere_ip=$(tail -1 ~/${rep}/${fichier_ip}|cut -d' ' -f5)

normal, puisque le fichier n’existe pas.
[/quote]
Ah. Normalement l’erreur aurait dû être silencieuse et ne pas arrêter l’exécution de script (c’est crade, mais je voulais rester le plus possible dans l’idée du script original pour mes remarques).

En fait, on aurait pu faire un

[code]if [ -f “$fichier_ip” ]; then
derniere_ip=$(tail -1 ~/${rep}/${fichier_ip}|cut -d’ ’ -f5)
else
derniere_ip=none
fi

if [ $derniere_ip != $ip ]; then
echo -e “$date_jour\t$ip” >> ~/${rep}/${fichier_ip}
fi[/code]

[quote=“Rantanplan aussi !”]J’ai modifié cette ligne en conséquence tout conservant l’esprit de tes modifs (parce qu’il est bon) comme ceci :

derniere_ip=$(tail -1 ~/${rep}/${fichier_ip} 2>/dev/null | sed 's/^.*[[:blank:]]\+//')

(j’ai aussi été obligé de remplacer le cut par un sed parce que le cut suivant ne fonctionne pas :

derniere_ip=$(tail -1 ~/${rep}/${fichier_ip} 2>/dev/null | cut -d'\t ' -f2)

mais ça m’est égal le sed me convient parfaitement. )
[/quote]

C’est parce que tu as donné 2 caractères à l’option -d de cut (qui par défaut prend la tabulation :wink: )

[quote=“Rantanplan aussi !”]Franchement BBT1 merci bien pour ce cours gratuit.

Yes cool are the Dragons :023[/quote]
N’hésite pas à partager tes astuces et autres “trouvailles” de bash sur le topic, même si je suis des fois occupé j’ai toujours un œuil sur le topic.

[quote=“Rantanplan aussi !”]Notes : en fait c’est suite à la reception du mail suivant que j’ai eu l’idée de ce script, extrait :

[quote=“SECUVAD”][…] Nous vous rappelons quelques éléments techniques de votre connexion :

* le 26/06/2007 à 13:58:00 : Acceptation des CGV depuis l'adresse 'www.xxx.yyy.zzz'
* le 27/06/2010 à 00:02:00 : Reconduction Abo mensuel à 29,90€/mois après offre 1€ les 7 jours du 19/06/10 pour un montant de 29.90 EUR depuis l'adresse 'www.xxx.yyy.zzz'

À ce jour, vous êtes donc redevable à l’égard de la société SARL INTERNET MACHIN TRUC BIDULE d’une somme totale de :

  • Principal : 29.00 EUR

En conséquence, et en application des dispositions de l’article 1139 du Code civil, nous vous mettons en demeure de régler sans délai la somme de 29.00 EUR.
[…]
[/quote]
On voit bien dans cet extrait qu’ils disent que j’avais la même IP à 3 ans d’interval (j’ai masqué les IP parce que c’est pas vraiment utile, mais c’était les mêmes), ce qui est débile avec l’offre Orange que j’avais.( j’ai changé le nom précis de la société en MACHIN TRUC BIBULE parce que bon …)

Je me suis fait avoir, j’ai payé, mais on ne pourra + m’affirmer que tel jour j’avais tel IP parce que si c’est pas vrai … ça va pas ce passer comme ça :smiling_imp:[/quote]
Légalement, les données enregistrées par ton script ne valent rien.

[quote=“BBT1”][quote=“ricardo”]Moi aussi je préfère la seconde forme mais je touve que ça fonctionne mieux avec “fi” :laughing:
Je pousse même le vice à déployer complètement :

if condition then commande fi[/quote]

Bof. Le then tout seul sur sa ligne n’apporte pas grand chose, il est sous-entendu par le if et encombre le bloc de commandes déjà facilement repérable par l’indentation de la ligne.

Pour moi, c’est une ligne perdue.[/quote]

Oui c’est une ligne perdue, mais l’important c’est que Ricardo puisse satisfaire ses vices :laughing:

Perso je trouve que même le then ne sert à rien (comme tu le sous-entendais) :

if condition_1 action_1 ; action_2 action_3 elif condition_2 ;action_21 ; action_22 action_23 else echo "vive toto" fi
m’irai trés bien
Ciao :stuck_out_tongue:

En fait je me suis trompé : l’erreur n’arrêtait pas l’exécution du script et l’IP était bien écrite dans le fichier (créé à la dernière ligne du script), puis l’exécution s’arrêtait normalement.C’est juste le message d’erreur de tail qui s’affichait. Ça ne se serait produit qu’à la première exec du script --> vraiment acceptable je trouve, même si pas trés clean (si on touche le même salaire à la fin du mois, hein :033 )

Ensuite je suis d’accord avec ta solution alternative, ça marche trés bien mais je vais rester comme c’est actuellement : ça me plait bien ! :stuck_out_tongue:

Pour le cut, c’est vrai qu’un espace s’est introduit je ne sais comment ? l’erreur est sûrement entre la chaise et le clavier comme on dit :mrgreen:

Mais ça ne marche pas, sous la forme que j’essayais :

[code]echo -e “J’adore\tles\tlasagnes\tà\tla\tbolognaise”
J’adore les lasagnes à la bolognaise

echo -e “J’adore\tles\tlasagnes\tà\tla\tbolognaise”|cut -d’\t’ -f1
cut: le délimiteur doit être un caractère simple
Saisissez « cut --help » pour plus d’informations.

echo -e “J’adore\tles\tlasagnes\tà\tla\tbolognaise”|cut -f1
J’adore
[/code]
Ouais ! j’adore apprendre des trucs, thanks BBT1 :023

Okay :stuck_out_tongue: j’en ai qques autres que je trouve indispensables (pour moi avec ma façon de fonctionner) qui sont pas bien gros ni compliqués !

Pour le moment je vais digérer ce que j’ai appris, j’ai autre script que je dois absolument terminer parce que ça me fera gagner qques secondes par jour (ça n’a l’air de rien mais c’est tjs ça de pris et de l’aggacement en moins au quotidien: ça vaut le coup :stuck_out_tongue: )

Oui, je sais bien. Ce qui est important pour moi c’est de savoir si en face ils ont les bonnes billes ou pas (ensuite déterminer s’ils font erreur ou s’ils sont de mauvaise foi est une autre étape). Si il y a erreur ou tentative d’escroquerie, alors je pourrais demander à mon FAI de me fournir mes IP aux dates correspondantes, ce serait sûrement payant mais si c’est la condition pour remporter la bataille je m’y résoudrai. Quitte à demander des dommages et intérêts ensuite, pour me rembourser et aller manger des coquilles St Jacques à leur frais :033 , histoire de tourner la page agréablement

Encore merci BBT1 :023

[quote=“BBT1”]Tu peux mettre la redirection avant ou après la commande
ex

est équivalent à

En fait, la redirection peut se trouver n’importe ou dès lors qu’elle n’est pas protégée. Il est même possible d’en avoir plusieurs pour la même entrée :

echo >/dev/null "Qui pensait que >/dev/null s'afficherait sur $(tty) ?" # n'affiche rien echo Qui pensait que >/dev/null s\'afficherait sur $(tty) ? # n'affiche rien echo Qui pensait que >/dev/null s\'afficherait sur >$(tty) ? # 2 redirections, c'est la dernière qui prime

Bonjour,

Ayant eu besoin de mettre à disposition des fichiers à un pote je lui ai donc créer un compte et lui ai permis de se connecter à ma machine via sftp. Cependant, en l’état, il pouvait accéder à d’autres fichiers de ma machine.

Dans un premier temps, j’ai pensé modifier les permissions mais cela ne changeait rien car l’une de mes arborescences est montée en cifs (dont le type de la partition est NTFS). Je n’arrivais pas à changer les permissions (ou alors, je m’y suis mal pris). Je me suis donc penché sur chroot qui permet de créer un environnement limité et surtout isolé à l’arborescence « chrooté ».

Le problème d’un tel environnement est qu’il faille y mettre tout ce que l’on a besoin. Si l’on veut utiliser un shell, il faut y ajouter le shell, si l’on veut lister un répertoire, il faut y ajouter la commande ls etc… Mais « ajouter » ne signifie pas seulement « copier le binaire » : il faut également y ajouter toutes les librairies dynamiques utilisées par le programme. Et ce n’est pas une mince affaire. Ces librairies sont identifiables via l’instruction ldd mais il arrive que l’utilisation de ldd ne suffise pas. On s’en aperçoit lors de leur utilisation dans l’environnement « chrooté ». J’en ai fait les frais pour « zsh » (je ne me suis pas encore penché sur la problématique mais il le faudrait dans le but de recenser la totalité des dépendances…)

De même, un tel environnement a besoin à minima des devices « null » et « zero ».

La création d’un tel environnement peut donc être long et délicat. M’y étant pris à plusieurs reprises, j’ai produit un script en zsh (*) permettant la création ou la modification (ajout de devices, librairies, programmes) d’un environnement « chrooté ».

Le voici (**) :

#!/bin/zsh -y

myName="${0##*/}"

# Affiche un message d'erreur formaté
showError()
{
	# on affiche sur la sortie d'erreur
	exec >&2

	myDate="$(date +'%T %d/%m/%Y')"
	
	# le statut est en 1er paramétre
	statut=$1
	shift
	# formatage de l'affichage de l'erreur
	erreur="$(printf "%s\n\t" "$@")"

	cat <<EO_ERROR
${myDate} - Erreur : ${erreur%$'\n'*}
Satut : ${statut}
EO_ERROR

	exit ${statut}
}

# Affiche de l'aide du script
showHelp()
{
	# on affiche sur la sortie d'erreur
	exec >&2

	cat << EO_HELP
Usage : ${myName} [ -v ] -d dossier [-p prog[,...]] [-d device[,...]] [ -f dossier[,...]] [ -l librairie[,...]]
	-d : Dossier chroot. Il est créé si inexistant, sinon vérifié et corrigé.
	-p : Liste des programmes à ajouter à l'arborescence.
	-d : Liste des devices à créer dans /dev en plus des devices "null" et "zero".
	-f : Liste des dossiers à ajouter à l'arbrescence en plus de bin, dev, lib, lib32 et lib64 en cas d'architecture x86_64.
	-l : Liste des librairies à ajouter à l'arborescence.
	-v : Mode verbeux

  Liste : Chaque élement d'une liste est séparé par une ",".
   prog : Chemin complet d'un programme. Les librairies dynamique du programme seront ajoutées au chroot.
 device : Un device est donné sous la forme "nom type <MINEUR> <MAJEUR>". Le masque appliqué est 666.
dossier : Le nom du ossier est à donner sans le dossier chroot.
EO_HELP

	(( $# > 0 )) && showError "${@}"
}

# Affiche d'un message d'information formaté
showInfo()
{
	${verbeux} && {
		myDate="$(date +'%T %d/%m/%Y')"
		infos="$(printf "%s\n\t" "$@")"
		printf "${myDate} : %s" "${infos%$'\t'}"
	}
}

# Vérification des paramétres envoyés au script
checkParams()
{
	# on précise le séparateur pour les liste
	local IFS=","

	# par défaut, pas de dossier chroot
	folderChroot=""
	devices=( "null c 1 3" "zero c 1 5" )

	_folders=()
	progs=()
	libraries=()
	verbeux=false

	# Analyse des paramètres
	while getopts :r:p:l:d:f:v option
	do
		case ${option} in
			\?) showHelp 2 "Valeur manquante pour l'option ${OPTARG}.";;
			:) showHelp 2 "Option non valide : ${OPTARG}.";;
			f) _folders=( ${=OPTARG} );;
			l) libraries=( ${=OPTARG} );;
			p) progs=( ${=OPTARG} );;
			r) folderChroot="${OPTARG%/}/";;
			d) devices+=( ${=OPTARG} );;
			v) verbeux=true;
		esac
	done

	# si pas de chroot --> erreur
	[[ -z "${folderChroot}" ]] && showHelp  2 "Option manquante : dossier chroot !"

	# Liste des dossiers par défaut
	folders=( "${folderChroot}"
		"${folderChroot}bin"
		"${folderChroot}dev" 
		"${folderChroot}lib"
		"${folderChroot}lib32"
		)
	# si 64bits, on ajoute lib64
	[[ "$(uname -m)" == "x86_64" ]] && folders+=( "${folderChroot}lib64/" )
	
	# on rajoute la liste des dossiers demandés
	(( ${#_folders[@]} > 0 )) && folders+=( "${_folders[@]/#/${folderChroot}}" )
	
	# on positionne un / à la fin de chacun des dossiers
	folders=( "${folders[@]%/}" )
	folders=( "${folders[@]/%//}" )
}

# Recherche le fichier cible d'un lien
myReadLink()
{
	file="$1"
	while [ -h "${file}" ]; do 
		file="$(readlink "${file}")"
	done
	echo "${file}"
}

# Copie d'un fichier dans le dossier chroot
copyFile()
{
	# fichier à copier
	file="$1"
	# fichier pointé par $1
	linkedFile="$(myReadLink "${file}")"
	# nom du fichier
	fileName="${file##*/}"

	# détermination du dossier cible
	destFolder="${folderChroot%/}$(cd "$(dirname "${file}")";pwd)/"

	# si dossier cible n'existe pas, on le créé
	[ ! -d "${destFolder}" ] && {
		showInfo "Création du dossier cible ${destFolder}"
		error="$(mkdir -p "${destFolder}"2>&1)"
		statut=$?
		
		if ((statut == 0)); then
			showInfo "Création OK."
		else
			showInfo "Erreur lors de la création !"
			showError ${statut} "${error}"
		fi
	}
	
	# copie du fichier
	showInfo "Copie de ${file} (${linkedFile}) vers ${destFolder}${fileName}..."
	error="$(cp ${file} "${destFolder}${fileName}" 2>&1)"
	statut=$?
	
	if ((statut == 0)); then
		showInfo "Copie OK."
	else
		showInfo "Erreur lors de la copie !"
		showError ${statut} "${error}"
	fi
}

# procédure de vérification et de création des dossiers
checkFolders()
{
	showInfo "Traitement des dossiers..."
	for folder in "${folders[@]}"
	do
		showInfo "Vérification du dossier ${folder}..."
		[ -d "${folder}" ] && showInfo "Le dossier existe." || {
			showInfo "Le dossier n'existe pas -> création"
			error="$(mkdir -p "${folder}" 2>&1)"
			statut=$?

			if ((statut == 0)); then
				showInfo "Création OK."
			else
				showInfo "Erreur lors de la création !"
				showError ${statut} "${error}"
			fi
		}
		
		showInfo 'Changement de propriétaire à "root:root":'
		error="$(chown root:root -R "${folder}" 2>&1)"
		statut=$?
		
		if ((statut == 0)); then
			showInfo "Changement OK."
		else
			showInfo "Erreur de changement de propriétaire !"
			showError ${statut} "${error}"
		fi
		
		showInfo 'Changement des droits à "755" :'
		error="$(chmod -R 755 "${folder}" 2>&1)"
		statut=$?
		
		if ((statut == 0)); then
			showInfo "Changement OK."
		else
			showInfo "Erreur de changement des droits !"
			showError ${statut} "${error}"
		fi
	done
	showInfo "Fin de traitement des dossiers."
}

# procédure de création des devices
checkDevices()
{
	showInfo "Traitement des devices..."
	folderDevice="${folderChroot}dev/"
	for device in "${devices[@]}"
	do
		read -A <<< ${device}
		
		deviceName="${folderDevice}${reply[1]}"
		showInfo "Vérification du device ${deviceName}..."
		
		
		if [ -e "${deviceName}" ]; then
			[ -c "${deviceName}" ] ||  showError 2 "Le fichier existe mais il ne s'agit pas d'un device !"
			showInfo "Le device existe."
		else
			showInfo "Le device n'existe pas -> création"
			error="$(mknod ${deviceName} ${=device#* } -m 666 2>&1)"
			statut=$?

			if ((statut == 0)); then
				showInfo "Création OK."
			else
				showInfo "Erreur lors de la création !"
				showError ${statut} "${error}"
			fi
		fi

		showInfo 'Changement de propriétaire à "root:root":'
		error="$(chown root:root "${deviceName}" 2>&1)"
		statut=$?
		
		if ((statut == 0)); then
			showInfo "Changement OK."
		else
			showInfo "Erreur de changement de propriétaire !"
			showError ${statut} "${error}"
		fi
	done
	showInfo "Fin de traitement des devices."
}

# procédure d'ajout des programmes dans l'arbo chroot
addPrograms()
{
	showInfo "Traitement des programmes..."
	for prog in "${progs[@]}"
	do
		showInfo "Vérification de ${prog}..."
		[ -f "${prog}" ] || showError 2 "Le programme ${prog} n'existe pas !"
		
		# est-ce un lien symbolique, auquel cas il faut rechercher la cible
		file="$(myReadLink "${prog}")"
		progName="${prog##*/}"			
		[ -h "${prog}" ] && showInfo "Fichier cible trouvé : ${file}"
		
		copyFile "${prog}"
		
		# traitement des librairies
		while read -A
		do
			case ${#reply} in
				2) # librarie externe à /lib trouvée
					showInfo "Librairie externe à /lib trouvée : ${reply[1]}"
					copyFile "${reply[1]}";;

				3) # librairie interne
					showInfo "Librairie interne à ${progName} trouvée : ${reply[1]}";;

				4) # librairie du dossier /lib
					showInfo "Librairie trouvée : ${reply[1]} -> ${reply[3]}"					
					copyFile "${reply[3]}";;

				*) showError 2 "Type de librairie inconnue : ${reply[@]}";;
			esac
		done < <(ldd "${file}")
	done
	(( ${#progs[@]} == 0 )) && showInfo "Aucun programe." || showInfo "Fin de traitement des programmes."
}

# procédure d'ajout des librairies supplémentaires
addLibraries()
{
	showInfo "Traitement des librairies..."
	for lib in "${libraries[@]}"
	do
		copyFile "${lib}"
	done
	(( ${#libraries[@]} == 0 )) && showInfo "Aucune librairie." || showInfo "Fin de traitement des librairies."
}

(( $(id -u) > 0 )) && showError 1 "Vous devez être root pour lancer ${myName} !"

checkParams "$@"

# vérification des dossiers
checkFolders

# vérification des devices
checkDevices

# ajout des programmes
addPrograms

# ajout des librairies
addLibraries

Pour l’utiliser :

Pour exemple :

% set -y; libs="$(printf "%s," /usr/lib/zsh/4.3.12/zsh/*.so )" % sudo ls -l /chroot ls: impossible d'accéder à /chroot: Aucun fichier ou dossier de ce type % sudo bin/mkchroot.zsh -r /chroot -d 'tty c 5 0,urandom c 1 9' -p /bin/ls,/bin/cp,/bin/zsh -l${libs%,} % find /chroot /chroot /chroot/lib /chroot/lib/libcap.so.2 /chroot/lib/x86_64-linux-gnu /chroot/lib/x86_64-linux-gnu/libpthread.so.0 /chroot/lib/x86_64-linux-gnu/libncursesw.so.5 /chroot/lib/x86_64-linux-gnu/2 /chroot/lib/x86_64-linux-gnu/librt.so.1 /chroot/lib/x86_64-linux-gnu/libtinfo.so.5 /chroot/lib/x86_64-linux-gnu/libm.so.6 /chroot/lib/x86_64-linux-gnu/libselinux.so.1 /chroot/lib/x86_64-linux-gnu/libdl.so.2 /chroot/lib/x86_64-linux-gnu/libattr.so.1 /chroot/lib/x86_64-linux-gnu/libacl.so.1 /chroot/lib/x86_64-linux-gnu/libc.so.6 /chroot/dev /chroot/dev/urandom /chroot/dev/zero /chroot/dev/tty /chroot/dev/null /chroot/usr /chroot/usr/lib /chroot/usr/lib/zsh /chroot/usr/lib/zsh/4.3.12 /chroot/usr/lib/zsh/4.3.12/zsh /chroot/usr/lib/zsh/4.3.12/zsh/termcap.so /chroot/usr/lib/zsh/4.3.12/zsh/zutil.so /chroot/usr/lib/zsh/4.3.12/zsh/computil.so /chroot/usr/lib/zsh/4.3.12/zsh/system.so /chroot/usr/lib/zsh/4.3.12/zsh/files.so /chroot/usr/lib/zsh/4.3.12/zsh/clone.so /chroot/usr/lib/zsh/4.3.12/zsh/rlimits.so /chroot/usr/lib/zsh/4.3.12/zsh/attr.so /chroot/usr/lib/zsh/4.3.12/zsh/mapfile.so /chroot/usr/lib/zsh/4.3.12/zsh/2 /chroot/usr/lib/zsh/4.3.12/zsh/parameter.so /chroot/usr/lib/zsh/4.3.12/zsh/zleparameter.so /chroot/usr/lib/zsh/4.3.12/zsh/terminfo.so /chroot/usr/lib/zsh/4.3.12/zsh/stat.so /chroot/usr/lib/zsh/4.3.12/zsh/newuser.so /chroot/usr/lib/zsh/4.3.12/zsh/langinfo.so /chroot/usr/lib/zsh/4.3.12/zsh/example.so /chroot/usr/lib/zsh/4.3.12/zsh/pcre.so /chroot/usr/lib/zsh/4.3.12/zsh/mathfunc.so /chroot/usr/lib/zsh/4.3.12/zsh/compctl.so /chroot/usr/lib/zsh/4.3.12/zsh/deltochar.so /chroot/usr/lib/zsh/4.3.12/zsh/zftp.so /chroot/usr/lib/zsh/4.3.12/zsh/cap.so /chroot/usr/lib/zsh/4.3.12/zsh/complist.so /chroot/usr/lib/zsh/4.3.12/zsh/zselect.so /chroot/usr/lib/zsh/4.3.12/zsh/curses.so /chroot/usr/lib/zsh/4.3.12/zsh/zprof.so /chroot/usr/lib/zsh/4.3.12/zsh/regex.so /chroot/usr/lib/zsh/4.3.12/zsh/zle.so /chroot/usr/lib/zsh/4.3.12/zsh/datetime.so /chroot/usr/lib/zsh/4.3.12/zsh/complete.so /chroot/usr/lib/zsh/4.3.12/zsh/sched.so /chroot/usr/lib/zsh/4.3.12/zsh/zpty.so /chroot/lib32 /chroot/bin /chroot/bin/ls /chroot/bin/zsh /chroot/bin/cp /chroot/lib64 /chroot/lib64/ld-linux-x86-64.so.2

enjoy !

  • : j’ai volontairement choisi cet interpréteur car il a tout (bien plus même) pour remplacer bash, sh ou ksh.
    cela dit, je le connais à peine mais le peu que je puisse constater me fait penser qu’il mérite beaucoup mieux que la place qu’il occupe aux rangs des intérpréteurs.

** : ce script n’a pas pour vocation de configurer sftp ou autre (c’est un autre sujet)

Sympa ton script :slightly_smiling:

Pour le cas particulier de fournir un accès à un shell sur un serveur limité, il y a lshell que j’aime bien.

Personnellement c’est pour permettre à des amis de créer un tunnel vers mon serveur. Je n’autorise que quelques commandes.

Ah bah je vais regarder lshell car je rencontre des difficultés à metre en place à la fois le transfert (sftp) et la connexion “remote login” via ssh.

2 petits scripts qui se sont révélés très pratiques utilisés conjointement:

Le premier (doqueue) très simple exécute une suite de commande dans un fichier:

#!/bin/sh if [ -z $1 ] ; then QUEUE=/tmp/queue else QUEUE=$1 fi INSTRUCTION="go" while [ -n "$INSTRUCTION" ] ; do INSTRUCTION=`head -n 1 $QUEUE` tail -n +2 $QUEUE > ${QUEUE}.old mv ${QUEUE}.old $QUEUE $INSTRUCTION done
$ doqueue queue exécutera les commandes du fichier queue.
On peut noter qu’il est possible de modifierfier le fichier queue alors même que le programme s’éxécute.

Le deuxième (doqueuepara) fait la même chose mais en parallèle:

#!/bin/sh DELAI=10 PIDS="" if [ -z $1 ] ; then QUEUE=/tmp/queue else QUEUE=$1 fi INSTRUCTION="go" OUT=1 while [ -n "$INSTRUCTION" ] ; do INSTRUCTION=`head -n 1 $QUEUE` tail -n +2 $QUEUE > ${QUEUE}.old mv ${QUEUE}.old $QUEUE $INSTRUCTION > /tmp/out-$OUT 2>&1 & PIDS=$PIDS" "$! OUT=$[$OUT+1] done CONT="go" while [ -n "$CONT" ] ; do INSTRUCTION=`head -n 1 $QUEUE` if [ -n "$INSTRUCTION" ] ; then while [ -n "$INSTRUCTION" ] ; do INSTRUCTION=`head -n 1 $QUEUE` tail -n +2 $QUEUE > ${QUEUE}.old mv ${QUEUE}.old $QUEUE $INSTRUCTION > /tmp/out-$OUT 2>&1 & PIDS=$PIDS" "$! OUT=$[$OUT+1] done fi CONT="" for i in $PIDS ; do CONT=$CONT`ps -p $i -o comm=` done sleep $DELAI done
doqueuepara queue exécute en parallèle toutes les commandes du fichier queue donné en argument. Tant que toutes les commandes ne sont pas achevées, il est possible d’en rajouter, elles démarreront immédiatement. Les sorties sont dans des fichiers /tmp/out-???

Cela est pratique pour faire des encodages de video.
Fichier queue

doqueuepara queuepara sudo pm-hibernate
Fichier queuepara fait au fur et à mesure contient des compilations ou encodages video par exemple, on les rajoute au fur et à mesure que les fichiers sont prêts. Puis on part et lorsque tout est fini, le PC se met en veille. Ces deux petits scripts idiots se sont finalement révélés très pratiques à l’usage d’où cette communication.

edit: modification suite aux remarques ci dessous, rajout d’un DELAI pour minimiser l’impact sur les performances.

Quelques petites remarques anodines ( oui vraiment ! )

À propos de “doqueuepara” que je n’ai fais “fonctionner” que dans ma tête

Je dirais que loin d’être idiot il est plutôt astucieux, je me suis d’abords dit " la var PIDS ne sert à rien !" erreur, elle sert tout à la fin. Puis " la boucle while [ -n “$CONT” ] ; do ne sert à rien non plus puisque à ce moment du script le fichier $QUEUE est vide" erreur : elle permet de rajouter des commandes en cours de route tant qu’il reste une tâche non finie … ça me plait bien tout ça ! :wink:

En fait seules les variables GETPID1=“ps -p " et GETPID2=” -o comm=" sont parfaitement inutiles ( des restes oubliés qui ne gènent en rien )

Il y a aussi la forme OUT=$[$OUT+1] qui est obsolète ( mais bon ça marche encore j’imagine ) et il y a aussi la forme commande qui est un héritage du C-Shell qui est parait-il à éviter ( mais on la voit dans de nombreux scripts du sys )

En tout cas faut pas se louper dans le fichier $QUEUE ! Il y a aussi le pb que pour savoir si une tâche à eu un PB il faut se farcir tous les fichiers /tmp/out-$OUT

M’enfin c’est tjs facile de critiquer ! :wink:

Edit J’ai testé le script, il fonctionne bien mais il ne faut pas que dans les commandes insérées dans ${QUEUE} les méta caractères du shell soient protégés sinon il peut y avoir des problèmes ( c’est testé, et c’est normal qu’il y ait des pbs dans ce cas), d’autre part la variable CONT=$CONTps -p $i -o comm= ne contient jamais le nom des processus mais seulement un espace " " pour chaque processus ? Alors que la commande directement exécuté au niveau du shell fonctionne normalement ?ps -p "1 2 3" -o comm= init kthreadd migration/0 ?

@ Totor je n’ai pas eu le temps d’examiner ton script, j’espère qu’un de ces quatre je pourrais le faire et apprendre plein de choses par la même occasion

Ave :stuck_out_tongue:

Bizarre pour la dernière remarque, chez moi ça contient bien les noms…

Oui je me suis trompé parce que j’avais modifié ton script ( pour éliminer la première boucle while dont on peut se passer en finassant, mais ce n’est pas très intéressant ) et j’ai fait une erreur

Voici une exécution de ton script (voir ton script modifié pour mes tests en fin de message) :

bash --version GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)

[code]pwd

/home/seb-deb[/code]

ls -lh queue

-rw-r----- 1 seb-deb seb-deb 18 29 févr. 16:26 queue

cat queue ls -lR / ls -lR /
puis ( voir mon edit en fin de message )

./bin/doqueuepara_modifié_pour_tests.sh queue [...] Dans while CONT Boucle for PIDS Fin de for PIDS et rebouclage while CONT CONT = lsls Dans while CONT Boucle for PIDS Fin de for PIDS et rebouclage while CONT CONT = lsls Dans while CONT
je rajoute les mêmes cdes dans le fichier queue ( vide à ce moment ) :

cat queue ls -lR / ls -lR /
Je reprend la sortie std de doqueuepara_modifié_pour_tests.sh :

... Dans while CONT Dans while INSTRUCTION INSTRUCTION = ls -lR / OUT = $[$[$[$[1+1]+1]+1]+1] PIDS = 17859 17863 17867 17938 Dans while INSTRUCTION INSTRUCTION = ls -lR / OUT = $[$[$[$[$[1+1]+1]+1]+1]+1] PIDS = 17859 17863 17867 17938 17942 Dans while INSTRUCTION INSTRUCTION = ls -lR / OUT = $[$[$[$[$[$[1+1]+1]+1]+1]+1]+1] PIDS = 17859 17863 17867 17938 17942 17946 Fin de while INSTRUCTION Boucle for PIDS Fin de for PIDS et rebouclage while CONT CONT = lslslsls Dans while CONT [...] tant que CONT n'est pas vide
Je remarque que j’ai 2 processus de trop ? mais peu importe CONT contient ce qu’il faut (j’ai pas analysé + que ça)

De + on dirait que le fichier queue contient 3 fois ls -lR / mais c’est parce que mon echo “INSTRUCTION = $INSTRUCTION” se trouve juste avant INSTRUCTION=head -n 1 $QUEUE , autrement dit mal placé …

Et ça marche bien

Par contre :

[code]pwd

/tmp[/code]

[code]ls -lhtr out-*

-rw-r----- 1 seb-deb seb-deb 0 29 févr. 16:30 out-$[$[1+1]+1]
-rw-r----- 1 seb-deb seb-deb 0 29 févr. 16:30 out-$[$[$[$[$[1+1]+1]+1]+1]+1]
-rw-r----- 1 seb-deb seb-deb 2,3M 29 févr. 16:31 out-$[$[$[$[1+1]+1]+1]+1]
-rw-r----- 1 seb-deb seb-deb 2,3M 29 févr. 16:31 out-$[$[$[1+1]+1]+1]
-rw-r----- 1 seb-deb seb-deb 2,3M 29 févr. 16:31 out-$[1+1]
-rw-r----- 1 seb-deb seb-deb 2,3M 29 févr. 16:31 out-1[/code]
Tu peux constater qu’en effet la construction OUT=$[$OUT+1] ne te donne pas le resultat attendu à savoir :

[code]ls -lhtr out-*

-rw-r----- 1 seb-deb seb-deb 0 29 févr. 16:40 out-3
-rw-r----- 1 seb-deb seb-deb 0 29 févr. 16:40 out-6
-rw-r----- 1 seb-deb seb-deb 2,5M 29 févr. 16:40 out-5
-rw-r----- 1 seb-deb seb-deb 2,5M 29 févr. 16:40 out-4
-rw-r----- 1 seb-deb seb-deb 2,5M 29 févr. 16:40 out-2
-rw-r----- 1 seb-deb seb-deb 2,5M 29 févr. 16:40 out-1[/code]
que l’on obtient en remplaçant OUT=$[$OUT+1] par OUT=$((OUT + 1))

Bon ? ça n’empêche pas un fonctionnement correct du script

En tout cas il est bien intéressant ce petit script ! j’ai appris des choses … :wink:

Notes
Pour info, voici ton script modifié pour mes tests :

(attention j’ai d’abord publié une version avec OUT=$((OUT + 1)) puis me rendant compte de ma bévue, j’ai corrigé avec OUT=$[$OUT+1] du script originel, dsl)

[code]cat doqueuepara_modifié_pour_tests.sh
#!/bin/sh
DELAI=10
PIDS=""
if [ -z $1 ] ; then
QUEUE=/tmp/queue
else
QUEUE=$1
fi
INSTRUCTION=“go"
OUT=1
while [ -n “$INSTRUCTION” ] ; do
INSTRUCTION=head -n 1 $QUEUE
tail -n +2 $QUEUE > ${QUEUE}.old
mv ${QUEUE}.old $QUEUE
$INSTRUCTION > /tmp/out-$OUT 2>&1 &
PIDS=$PIDS” "$!
OUT=$[$OUT+1]
done
CONT="go"
while [ -n “$CONT” ] ; do

ajout Rantanplan aussi ! pour tests

echo “Dans while CONT”

fin ajout pour tests

INSTRUCTION=head -n 1 $QUEUE
if [ -n “$INSTRUCTION” ] ; then
while [ -n “$INSTRUCTION” ] ; do

ajout Rantanplan aussi ! pour tests

     echo "Dans while INSTRUCTION"
     echo "INSTRUCTION = $INSTRUCTION"

fin ajout pour tests

     INSTRUCTION=`head -n 1 $QUEUE`
     tail -n +2 $QUEUE > ${QUEUE}.old
     mv ${QUEUE}.old $QUEUE
     $INSTRUCTION > /tmp/out-$OUT 2>&1 &
     PIDS=$PIDS" "$!
     OUT=$[$OUT+1]

ajout Rantanplan aussi ! pour tests

     echo "OUT = $OUT"
     echo "PIDS = $PIDS"

fin ajout pour tests

  done

ajout Rantanplan aussi ! pour tests

  echo "Fin de while INSTRUCTION"

fin ajout pour tests

fi
CONT=""

ajout Rantanplan aussi ! pour tests

echo “Boucle for PIDS”

fin ajout pour tests

for i in $PIDS ; do
CONT=$CONTps -p $i -o comm=
done

ajout Rantanplan aussi ! pour tests

echo "Fin de for PIDS et rebouclage while CONT"
echo “CONT = $CONT”

fin ajout pour tests

sleep $DELAI mis en commentaire pour tests

done
[/code]

[code]diff doqueuepara_original.sh doqueuepara_modifié_pour_tests.sh
20a21

echo "Dans while CONT"
23a25,26
echo "Dans while INSTRUCTION"
echo "INSTRUCTION = $INSTRUCTION"
29a33,34
echo "OUT = $OUT"
echo "PIDS = $PIDS"
30a36
echo "Fin de while INSTRUCTION"
32a39
echo "Boucle for PIDS"
36c43,45
< sleep $DELAI


echo "Fin de for PIDS et rebouclage while CONT"
echo “CONT = $CONT”

sleep $DELAI

[/code]

Edit : pour une analyse + simple il vaut mieux rediriger la sortie std du script dans un fichier :
[size=85]doqueuepara_modifié_pour_tests.sh queue > sortie-doqueuepara_modifié_pour_tests.sh.txt[/size]
puis éditer le fichier: sortie-doqueuepara_modifié_pour_tests.sh.txt

J’espère n’avoir pas été trop confus !

Un jour tu découvriras l’option -x (Edit : de bash qui permet de voir tout ce qu’exécute bash) :slightly_smiling:

J’ai pas regardé plus les scripts que ça, donc je ne donne pas mon avis.

[quote=“MisterFreez”]Un jour tu découvriras l’option -x :slightly_smiling:

J’ai pas regardé plus les scripts que ça, donc je ne donne pas mon avis.[/quote]
Tu veux parler de

-x | permettre le suivit du script instruction par instruction
Parce que suivant le contexte il y a des “tas” de “-x”

Essaye de préciser un peu tout ça, et merci pour ton éclairage :wink: