<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux Attitude&#187; Scripting</title>
	<atom:link href="http://linux-attitude.fr/tag/scripting/feed" rel="self" type="application/rss+xml" />
	<link>http://linux-attitude.fr</link>
	<description>Le libre est un état d&#039;esprit</description>
	<lastBuildDate>Fri, 03 Feb 2012 17:45:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Scripting avec pam_exec, notification de connexion</title>
		<link>http://linux-attitude.fr/post/pam_exec?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pam_exec</link>
		<comments>http://linux-attitude.fr/post/pam_exec#comments</comments>
		<pubDate>Tue, 30 Nov 2010 09:00:35 +0000</pubDate>
		<dc:creator>StalkR</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[pam]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Système]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=1122</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: pam_exec Vous souvenez-vous de PAM (Pluggable Authentication Modules)&#160;? En plus des nombreux modules déjà présentés, on trouve pam_exec qui permet d'exécuter une commande arbitraire. A partir de là on peut faire pas mal de choses, comme par exemple une notification à chaque session ouverte par un utilisateur (connexion ssh, su, sudo, etc.). [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: pam_exec</p>


<p>Vous souvenez-vous de <strong>PAM</strong> (<em>Pluggable Authentication Modules</em>)&nbsp;? En plus des nombreux modules <a href="http://linux-attitude.fr/post/papiers-sil-vous-plait">déjà présentés</a>, on trouve <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_exec.html" hreflang="en">pam_exec</a> qui permet d'exécuter une commande arbitraire. A partir de là on peut faire pas mal de choses, comme par exemple une notification à chaque session ouverte par un utilisateur (connexion ssh, su, sudo, etc.).</p>



<p><br /></p>

<h3>Notification de connexion</h3>

<p>Nous allons créer une règle utilisant le module <em>pam_exec</em> pour exécuter un script de notification à l'ouverture d'une nouvelle session.</p>


<p><br /></p>

<h5>Script de notification</h5>

<p>D'après le <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_exec.html">manuel de pam_exec</a>, les informations PAM sont passées au script à l'aide des variables d'environnement&nbsp;: <em>PAM_RHOST</em>, <em>PAM_RUSER</em>, <em>PAM_SERVICE</em>, <em>PAM_TTY</em>, <em>PAM_USER</em> et <em>PAM_TYPE</em>. Concevons donc un script simple qui&nbsp;:</p>
<ul>
<li>ne s'intéresse qu'au cas de l'ouverture d'une nouvelle session, soit le type PAM <em>open_session</em></li>
<li>récupère les informations et les envoie par mail à l'administrateur</li>
</ul>

<p><span id="more-1122"></span></p>

<pre>
#!/bin/sh
[ &quot;$PAM_TYPE&quot; = &quot;open_session&quot; ] || exit 0
{
  echo &quot;User: $PAM_USER&quot;
  echo &quot;Ruser: $PAM_RUSER&quot;
  echo &quot;Rhost: $PAM_RHOST&quot;
  echo &quot;Service: $PAM_SERVICE&quot;
  echo &quot;TTY: $PAM_TTY&quot;
  echo &quot;Date: `date`&quot;
  echo &quot;Server: `uname -a`&quot;
} |mail -s &quot;`hostname -s` $PAM_SERVICE login: $PAM_USER&quot; root
</pre>


<p>On peut sauver ce script sous <code>/usr/local/bin/pam-notify-login</code> et n'oublions pas de le rendre exécutable&nbsp;:</p>
<pre>
# chmod a+x /usr/local/bin/pam-notify-login
</pre>


<p>Remarque&nbsp;: vous aurez besoin d'une version récente des modules PAM pour avoir la variable d'environnement <em>PAM_TYPE</em> envoyée par le module <em>pam_exec</em>. En effet celle-ci n'a été ajoutée qu'à partir de la <a href="http://pam.cvs.sourceforge.net/viewvc/pam/Linux-PAM/modules/pam_exec/pam_exec.c?r1=1.7&amp;amp;r2=1.8">révision 1.8</a>. Concrètement Debian lenny ne l'a pas (libpam-modules 1.0) alors que squeeze l'a (libpam-modules 1.1).</p>


<p><br /></p>

<h5>Règle pam_exec</h5>

<p>Après consultation de la <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html">documentation Linux-PAM</a>, voici la règle à utiliser&nbsp;:</p>
<pre>
session    optional     pam_exec.so    /usr/local/bin/pam-notify-login
</pre>

<p>Il faut maintenant l'ajouter à tous les services interactifs (donc pas cron) qui utilisent PAM&nbsp;: SSH, login, su, sudo, etc. Sous Debian (et certainement d'autres distrib), on peut le faire grâce au fichier <code>/etc/pam.d/common-session</code>  qu'incluent les services intéractifs. On ajoute donc cette règle à la fin du fichier.</p>


<p>Attention cependant si vous utilisez <strong>sudo</strong> sous Debian, un petit <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=519700">oubli</a> fait que la règle de <strong>sudo</strong> n'inclut pas ce fichier. On doit donc rajouter la règle à la main dans <code>/etc/pam.d/sudo</code> en attendant mieux.</p>


<p>Une fois les règles ajoutées, essayez de vous connecter en SSH, de faire un su ou un sudo&nbsp;: vous devriez recevoir la notification par mail.</p>


<p><strong>PS</strong>&nbsp;: Ceci est un billet invité, s'il vous a plu, vous pouvez aller lire la prose de StalkR en version originale <a href="http://blog.stalkr.net/" hreflang="en">sur son site</a>.</p>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/en-vrac-20' rel='bookmark' title='Permanent Link: En vrac (20)'>En vrac (20)</a></li>
<li><a href='http://linux-attitude.fr/post/en-vrac-22' rel='bookmark' title='Permanent Link: En vrac (22)'>En vrac (22)</a></li>
<li><a href='http://linux-attitude.fr/post/connaitre-les-protocoles-pop' rel='bookmark' title='Permanent Link: Connaitre les protocoles : POP'>Connaitre les protocoles : POP</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/pam" title="pam" rel="tag">pam</a>, <a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/scripting" title="Scripting" rel="tag">Scripting</a>, <a href="http://linux-attitude.fr/tag/securite" title="Sécurité" rel="tag">Sécurité</a>, <a href="http://linux-attitude.fr/tag/systeme" title="Système" rel="tag">Système</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/pam_exec/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Expression régulière</title>
		<link>http://linux-attitude.fr/post/expression-reguliere?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=expression-reguliere</link>
		<comments>http://linux-attitude.fr/post/expression-reguliere#comments</comments>
		<pubDate>Thu, 07 Oct 2010 17:02:43 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Commande]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=1038</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: test d'expression régulière Vous essayez de développer une expression régulière mais vous ne savez pas pourquoi ça ne marche pas&#160;? Tester une expression Je vous propose le petit programme suivant qui vous aidera dans la compréhension du fonctionnement de votre regex. Son usage est simple&#160;: ./regtest.pl &#60;regex&#62; &#60;chaine&#62; Exemple&#160;: ./regtest.pl "(\d+7)\.1\." "127.127.1.12" [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: test d'expression régulière</p>


<p>Vous essayez de développer une expression régulière mais vous ne savez pas pourquoi ça ne marche pas&nbsp;?</p>


<h3>Tester une expression</h3>

<p>Je vous propose le petit <a href="http://linux-attitude.fr/public/Code/regtest.pl">programme suivant</a> qui vous aidera dans la compréhension du fonctionnement de votre regex. Son usage est simple&nbsp;:</p>
<pre>
./regtest.pl &lt;regex&gt; &lt;chaine&gt;
</pre>


<p>Exemple&nbsp;:</p>
<pre>
./regtest.pl "(\d+7)\.1\." "127.127.1.12"
<span style="color: #F00">127</span>.127.1.12 : \d+
<span style="color: #F00">127</span>.127.1.12 : \d+7
<span style="color: #F00">127</span>.127.1.12 : (\d+7)
127.<span style="color: #F00">127.1.</span>12 : (\d+7)\.1\.
    127      : $1
</pre>



<p>Le programme découpe l'expression en éléments syntaxiquement  corrects et les applique à la chaine pour voir ce qui matche et le met en évidence. A la fin la liste des groupes qui ont matchés est affiché.</p>


<p>Il est aussi possible de remplacer une des paramètres (la chaine ou la regex) par un '-'. Le programme boucle alors sur l'entrée et vous permet d'entrer une ligne à chaque fois. Vous pouvez donc faire un test en continu. L'avantage et surtout pour les regexp, cela permet de s'affranchir des caractères spéciaux qui pourraient être interprétés par le shell.</p>


<p>Notez que vous aurez besoin de Regexp::Parser qui n'est pas installé par défaut.
<span id="more-1038"></span>
Pour cela le plus simple est de se connecter en root puis de faire</p>
<pre>
$ perl -e shell -MCPAN
install Regexp::Parser
</pre>


<p>Et oula, maintenant plus de problème, vous pouvez tester vos expression régulières facilement&nbsp;!</p>


<h3>Comment ca marche&nbsp;?</h3>

<p>En écrivant ce petit programme, voici quelques petites astuces que j'ai utilisé.</p>


<p>Écrire en couleur dans le terminal de façon portable&nbsp;:</p>
<pre>
use Term::ANSIColor;
print colored(&quot;string&quot;, 'red');
</pre>


<p>Parser une expression régulière perl dans une structure lisible (arbre)&nbsp;:</p>
<pre>
use Regexp::Parser;
my $parser = Regexp::Parser-&gt;new;
$parser-&gt;parse($reg);
</pre>


<p>Récupérer 3 parties d'une chaine lors d'un matching&nbsp;:</p>
<ul>
<li>$`&nbsp;: avant le match</li>
<li>$&amp;&nbsp;: tout le match</li>
<li>$'&nbsp;: après le mach</li>
</ul>

<p>Récupérer les position des éléments matchés et des groupes dans la chaine en question&nbsp;:</p>
<ul>
<li>@-&nbsp;: tableau des positions de début de chaque groupe</li>
<li>@+&nbsp;: tableau des positions de fin de chaque groupe</li>
</ul>

<p><a href="http://linux-attitude.fr/public/Code/regtest.pl">Vous trouverez le code ici</a>.</p>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/en-vrac-14' rel='bookmark' title='Permanent Link: En vrac (14)'>En vrac (14)</a></li>
<li><a href='http://linux-attitude.fr/post/soyez-reguliers-1' rel='bookmark' title='Permanent Link: Soyez réguliers (1)'>Soyez réguliers (1)</a></li>
<li><a href='http://linux-attitude.fr/post/lignes-de-commande-en-sed' rel='bookmark' title='Permanent Link: Lignes de commande en sed'>Lignes de commande en sed</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/commande" title="Commande" rel="tag">Commande</a>, <a href="http://linux-attitude.fr/tag/perl" title="Perl" rel="tag">Perl</a>, <a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/scripting" title="Scripting" rel="tag">Scripting</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/expression-reguliere/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Le xml n&#8217;est pas pour les humains</title>
		<link>http://linux-attitude.fr/post/le-xml-nest-pas-pour-les-humain?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=le-xml-nest-pas-pour-les-humain</link>
		<comments>http://linux-attitude.fr/post/le-xml-nest-pas-pour-les-humain#comments</comments>
		<pubDate>Mon, 17 May 2010 17:12:36 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=884</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: Aujourd'hui un thème un peu polémique mais pas trop quand même. Le XML est un descendant du SGML. C'est un format structuré de données comme l'est l'ASN1 ou le LDIF. Tous ces formats ont été inventés dans une seule optique&#160;: être facile à parser par une machine. Et pourtant quand on voit [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;:</p>


<p>Aujourd'hui un thème un peu polémique mais pas trop quand même.</p>


<p>Le <a href="http://fr.wikipedia.org/wiki/Extensible_Markup_Language" hreflang="fr">XML</a> est un descendant du <a href="http://fr.wikipedia.org/wiki/Standard_Generalized_Markup_Language" hreflang="fr">SGML</a>. C'est un format structuré de données comme l'est <a href="http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One" hreflang="en">l'ASN1</a> ou le <a href="http://fr.wikipedia.org/wiki/LDAP_Data_Interchange_Format">LDIF</a>.</p>


<p>Tous ces formats ont été inventés dans une seule optique&nbsp;: être facile à parser par une machine. Et pourtant quand on voit les subtilités du XML et les difficultés à faire un parseur, on peut avoir des doutes... Mais de ce fait ils sont peu lisibles.</p>


<p>Ne vous méprenez pas, le XML a tout à fait sa place dans les échange de données, dans la communication entre machines. Le format est bien défini et fonctionne quel que soit le type de machine. Il est d'ailleurs très utilisé car on trouve des parseurs partout, dans presque tous les langages, et dans presque tous les frameworks.</p>


<p>Mais à force d'en user on en abuse.</p>


<p>Non le XML n'est PAS fait pour les humains&nbsp;! Le xml n'est pas à sa place dans les fichiers de configuration, à moins que vous n'ayez pour objectif que l'utilisateur ne touche jamais à ces fichiers et que vous ayez le temps de développer une interface entre l'utilisateur et la modification (texte&nbsp;? graphique&nbsp;? sonore ?).</p>


<p>Le XML est pratique car il permet au développeur d'éviter l'usage de protocoles binaires incompréhensibles et mal parsés entre deux applications. Il est pratique car un autre développeur peut lire ce protocole sans l'avoir appris. Mais vous remarquerez que je ne parle que de développeurs, pas d'utilisateurs.</p>


<p>Alors par pitié arrêtez le XML dans les fichiers destinés aux HUMAINS. Il existe bien d'autres formats ayant des parseurs et tout aussi lisibles&nbsp;:</p>
<ul>
<li>le <a href="http://fr.wikipedia.org/wiki/Fichier_INI" hreflang="fr">format INI</a></li>
<li>le <a href="http://fr.wikipedia.org/wiki/Yaml" hreflang="fr">format YAML</a></li>
<li>le <a href="http://fr.wikipedia.org/wiki/Json">format JSON</a></li>
</ul>

<p>Mieux, il existe <a href="http://onlamp.com/pub/a/onlamp/2006/02/16/introducing-lua.html" hreflang="en">LUA</a> qui vous permet à la fois d'avoir un fichier de configuration simple et lisible, mais qui en plus autorise l'utilisateur à faire des choses que vous n'auriez pas prévu, comme des configuration conditionnelles&nbsp;!</p>
	Tags:<a href="http://linux-attitude.fr/tag/code" title="Code" rel="tag">Code</a>, <a href="http://linux-attitude.fr/tag/scripting" title="Scripting" rel="tag">Scripting</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/le-xml-nest-pas-pour-les-humain/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Scripts nautilus</title>
		<link>http://linux-attitude.fr/post/scripts-nautilus?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scripts-nautilus</link>
		<comments>http://linux-attitude.fr/post/scripts-nautilus#comments</comments>
		<pubDate>Sun, 31 May 2009 12:23:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/post/scripts-nautilus</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: ~/.gnome2/nautilus-scripts Aujourd'hui parlons un peu d'interface utilisateur. Vous arrive-t-il souvent de lancer la même commande sur plein de fichiers&#160;? Avez-vous une personne de votre famille qui perd son temps à ouvrir des fichiers un par un pour faire une modification dans chaque&#160;? Si ces opérations sont automatisables (calculs openoffice, modification d'image, ajout [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: ~/.gnome2/nautilus-scripts</p>


<p>Aujourd'hui parlons un peu d'interface utilisateur. Vous arrive-t-il souvent de lancer la même commande sur plein de fichiers&nbsp;?
Avez-vous une personne de votre famille qui perd son temps à ouvrir des fichiers un par un pour faire une modification dans chaque&nbsp;?</p>


<p>Si ces opérations sont automatisables (calculs openoffice, modification d'image, ajout d'une ligne de texte ...) alors il y a un moyen pour les rendre accessible directement depuis le navigateur de fichier. Pour cela, il suffit d'écrire un script et de le placer dans ~/.gnome2/nautilus-scripts. Essayer de bien le nommer car il apparaîtra tel quel dans le menu contextuel "Scripts" de nautilus.</p>


<p>Pour parler concrètement, nous allons faire un outil de réduction d'image disponible directement depuis le navigateur de fichier.
Nous allons donc éditer le fichier <strong>~/.gnome2/nautilus-scripts/ReductionPhotos</strong> qui nous permettra d'appeler imagemagick pour réduire la taille des photos sélectionnées (en ajoutant un préfixe pour ne rien perdre). Nous feront notre démo sur tous les fichiers sélectionnés à la souris pour bien montrer qu'on automatise un comportement d'utilisateur "normal".</p>


<p>Le script reçoit ses informations dans des variables d'environnement. La plus importante dans notre cas est <strong>NAUTILUS_SCRIPT_SELECTED_FILE_PATHS</strong> qui contient la liste des fichiers sélectionnés séparés par des retours à la ligne. Donc une petite boucle pour les traiter tous d'un coup&nbsp;:</p>
<pre>
echo -n &quot;$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS&quot; | while read in_file
do
        process_file $in_file
done
</pre>


<p>Alors il se peut que le script ait des questions à poser à l'utilisateur. C'est le moment d'utiliser zenity. Un petit outil sympa, équivalent de dialog, mais bien mieux intégré dans gnome. Petite exemple avec la sélection d'un nombre dans une intervalle de 0 à 100&nbsp;:</p>
<pre>
$ percent=$(zenity --scale --title=&quot;Choix du pourcentage&quot; --text &quot;Pourcents : &quot; --value=&quot;50&quot; --min-value=&quot;0&quot; --max-value=&quot;100&quot; --step=&quot;1&quot;)
</pre>


<p>Simple non&nbsp;?</p>


<p>Pour traiter les images en ligne de commande, vous connaissez imagemagick. Voici la commande à utiliser dans mon cas&nbsp;:</p>
<pre>
convert image1.jpg -quality 80 -resize 1200 image2.jpg
</pre>


<p>Voila, on a toutes les briques pour faire le script.</p>


<p><span id="more-316"></span></p>

<pre>
#!/bin/bash
#
# Name : ReductionPhoto
# Author : peck
# Licence : GPLv2
#

set -x

#################################################
#       FONCTIONS
ask_questions ()
{
        # question communes à tous les fichieirs
        quality=$(zenity --scale --title=&quot;Choix de qualite&quot; --text &quot;Qualite&quot; --value=&quot;75&quot; --min-value=&quot;0&quot; --max-value=&quot;100&quot; --step=&quot;1&quot;)
        width=$(zenity --entry --title=&quot;Largeur de l'ecran&quot; --text &quot;Largeur&quot; --entry-text=&quot;1200&quot;)
}

reduct()
{
        # options de reduction
        options=&quot;-quality $quality -resize $width&quot;
echo $options &gt;&gt; /tmp/debug

        # sauter les non-images
        if identify &quot;$1&quot; &gt;/dev/null
        then
                # convertir
                convert &quot;$1&quot; $options &quot;$2&quot;
        fi
}

#################################################
#       PROGRAMME
if [ $# -eq 0 ]; then
        zenity --error --title=&quot;Erreur&quot; --text=&quot;Pas de fichier selectionne pour la conversion&quot;
        exit 1
fi
if which convert 2&gt;/dev/null
then
        true
else
        zenity --error --title=&quot;Erreur&quot; --text=&quot;ImageMagick n'est pas installe&quot;
        exit 1
fi

# c'est parti
ask_questions
echo -n &quot;$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS&quot; | while read in_file
do
        ibase=$(basename &quot;$in_file&quot;)
        idir=$(dirname &quot;$in_file&quot;)
        out_file=&quot;$idir/r_$ibase&quot;

        # on fait gaffe aux fichiers qu'on ecrase
        if ls &quot;$out_file&quot;
        then
                if zenity --question --title=&quot;Fichier existant&quot; --text=&quot;Remplacer r_$ibase ?&quot;
                then
                        reduct &quot;$in_file&quot; &quot;$out_file&quot;
                fi
        else
                reduct &quot;$in_file&quot; &quot;$out_file&quot;
        fi
done

# et ouala
zenity --text &quot;Fin&quot; --info &quot;Reduction terminee&quot;
</pre>


<p>À vous de faire tout ce qui vous intéresse, le reste de la doc se trouve dans la faq du <a href="http://g-scripts.sourceforge.net/" hreflang="en">site</a></p>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/un-seul-langage-pour-les-scripts' rel='bookmark' title='Permanent Link: Un seul langage pour les scripts'>Un seul langage pour les scripts</a></li>
<li><a href='http://linux-attitude.fr/post/en-vrac-20' rel='bookmark' title='Permanent Link: En vrac (20)'>En vrac (20)</a></li>
<li><a href='http://linux-attitude.fr/post/en-vrac-22' rel='bookmark' title='Permanent Link: En vrac (22)'>En vrac (22)</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/scripting" title="Scripting" rel="tag">Scripting</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/scripts-nautilus/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>En vrac (23)</title>
		<link>http://linux-attitude.fr/post/en-vrac-23?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-vrac-23</link>
		<comments>http://linux-attitude.fr/post/en-vrac-23#comments</comments>
		<pubDate>Wed, 27 May 2009 18:16:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/post/en-vrac-23</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: pam_faildelay.so&#160;; tail -F *&#160;; dusort&#160;; Réduire le délai en cas d'erreur du mot de passe (très chiant pour su par exemple). Simple calcul, le délai par défaut de 2s donne 13243 ans pour bruteforcer un mot de passe de 8 lettres (26 possibilités). On peut donc se permettre de diviser ce délai [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: pam_faildelay.so&nbsp;; tail -F *&nbsp;; dusort&nbsp;;</p>


<p>Réduire le délai en cas d'erreur du mot de passe (très chiant pour su par exemple).
Simple calcul, le délai par défaut de 2s donne 13243 ans pour bruteforcer un mot de passe de 8 lettres (26 possibilités). On peut donc se permettre de diviser ce délai par 4 pour apporter un peu de confort à l'usage&nbsp;:</p>
<pre>
$ vi /etc/pam.d/common-auth
# on annule le délay ajouté par pam_unix
auth    required        pam_unix.so nullok_secure nodelay
# on ajoute un délai en microsecondes
auth  optional  pam_faildelay.so  delay=500000
</pre>

<p>Attention, login vient avec son propre délai supplémentaire de 3 secondes chez debian (dans /etc/pam.d/login).</p>



<p>Il est possible de regarder les nouvelles lignes sur plusieurs fichiers en même temps&nbsp;:</p>
<pre>
$ tail -F /var/log/*
</pre>


<p>Alias pour connaître rapidement les 10 plus gros répertoire du répertoire en cours&nbsp;:</p>
<pre>
$ alias dusort='du --max-depth=1 | sort -rn | head -n 10'
</pre>


<p>Appeler une commande en évitant tous les alias possible (par exemple rm qui est aliasé rm -i):</p>
<pre>
# bash uniquement
$ \commande
</pre>


<p>Avancer / reculer d'un mot lors de l'édition de ligne (bash ou tout outil readline) <strong>Esc-fleche</strong> droite ou gauche.</p>


<p>Effacer les fichiers de plus de XX jours&nbsp;:</p>
<pre>
$ find . -not -ctime -XX -name &quot;*.ncap&quot; -exec rm {} ;
</pre>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/en-vrac-17' rel='bookmark' title='Permanent Link: En vrac (17)'>En vrac (17)</a></li>
<li><a href='http://linux-attitude.fr/post/en-vrac-22' rel='bookmark' title='Permanent Link: En vrac (22)'>En vrac (22)</a></li>
<li><a href='http://linux-attitude.fr/post/en-vrac16' rel='bookmark' title='Permanent Link: En vrac(16)'>En vrac(16)</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/scripting" title="Scripting" rel="tag">Scripting</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/en-vrac-23/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>En vrac (22)</title>
		<link>http://linux-attitude.fr/post/en-vrac-22?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-vrac-22</link>
		<comments>http://linux-attitude.fr/post/en-vrac-22#comments</comments>
		<pubDate>Tue, 14 Apr 2009 18:57:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Commande]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/post/en-vrac-22</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: moreutils&#160;; ts&#160;; vidir&#160;; mispipe&#160;; isutf8&#160;; lckdo&#160;; vipe&#160;; ifdata&#160;; pee Ces commandes sont dans le paquet moreutils sur debian. Ajouter un timestamp sur chaque ligne pour lire une commande un peu lente&#160;: $ ./commande &#124; ts &#124; tail Éditer en masse les entrées d'un répertoire (pour renommer des images par exemple)&#160;: # Tout [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: moreutils&nbsp;; ts&nbsp;; vidir&nbsp;; mispipe&nbsp;; isutf8&nbsp;; lckdo&nbsp;; vipe&nbsp;; ifdata&nbsp;; pee</p>


<p>Ces commandes sont dans le paquet moreutils sur debian.</p>


<p>Ajouter un timestamp sur chaque ligne pour lire une commande un peu lente&nbsp;:</p>
<pre>
$ ./commande | ts | tail
</pre>



<p>Éditer en masse les entrées d'un répertoire (pour renommer des images par exemple)&nbsp;:</p>
<pre>
# Tout le répertoire
$ vidir repertoire
# Seulement les images 
$ vidir *.jpg
</pre>



<p>Retourner le code d'erreur du premier élément d'un pipe et non du dernier (très utile en scripting)&nbsp;:</p>
<pre>
# Retourne une erreur si $dir n'existe pas
$ mispipe &quot;ls $dir&quot; &quot;tail&quot;
</pre>



<p>Vérifier qu'un fichier utf8 est valide&nbsp;:</p>
<pre>
$ isutf8 fichier &amp;&amp; echo OK || echo &quot;Not OK&quot; 
</pre>



<p>Ne pas écraser un fichier de destination avant la fin de la commande&nbsp;:</p>
<pre>
# Version fonctionnelle de cat a b &gt; a
$ cat a b | sponge a
</pre>



<p>Créer un script de type cron avec un lock sans effort&nbsp;:</p>
<pre>
$ lckdo -W 10 /var/lock/mylock /usr/local/bin/myscript
</pre>



<p>Éditer le contenu d'un pipe (très pratique pour le debug de script)&nbsp;:</p>
<pre>
$ commande1 | vipe | commande2
</pre>



<p>Éviter les envois de mail de rapport lorsqu'il n'y a rien à rapporter&nbsp;:</p>
<pre>
$ /usr/local/bin/rapport.pl | ifne mail -s &quot;Synchro en retard&quot; sysadmins@mynnet.net
</pre>



<p>Permettre (optionnelle ment) de passer des fichiers compressés en argument à un script (comme pour zless)&nbsp;:</p>
<pre>
# Recoder zless
$ zrun less $1
</pre>



<p>Éviter de parser le résultat de ifconfig ou de ip dans un script (nombreuses options, de sortie, lire le man)&nbsp;:</p>
<pre>
# Afficher le nombre d'octets reçus
$ ifdata -sib eth0
</pre>



<p>Passer le résultat d'une commande à plusieurs autres</p>
<pre>
# Attention si commande1 et commande2 produit du texte, rien ne garantit leur ordre
$ commande | pee &quot;commande1&quot; &quot;commande2&quot;
</pre>



<p>Comparer ligne par ligne deux fichiers avec des opérateurs plus évolués que comm&nbsp;:</p>
<pre>
$ combine fichier1 xor fichier2
</pre>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/en-vrac16' rel='bookmark' title='Permanent Link: En vrac(16)'>En vrac(16)</a></li>
<li><a href='http://linux-attitude.fr/post/en-vrac-24' rel='bookmark' title='Permanent Link: En vrac (24)'>En vrac (24)</a></li>
<li><a href='http://linux-attitude.fr/post/en-vrac-23' rel='bookmark' title='Permanent Link: En vrac (23)'>En vrac (23)</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/commande" title="Commande" rel="tag">Commande</a>, <a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/scripting" title="Scripting" rel="tag">Scripting</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/en-vrac-22/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>En vrac (20)</title>
		<link>http://linux-attitude.fr/post/en-vrac-20?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-vrac-20</link>
		<comments>http://linux-attitude.fr/post/en-vrac-20#comments</comments>
		<pubDate>Mon, 02 Mar 2009 18:32:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/post/en-vrac-20</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: man -H&#160;; $-&#160;; dd&#160;; losetup&#160;; bc&#160;; APT::Install-Recommends=false&#160;; /proc/net/ip_conntrack Tester si on est dans un shell interactif (spécifique bash)&#160;: $ if [[ &#34;$-&#34; == *i* ]]; then echo INTERACTIF; fi Réduire le lecteur dvd au silence&#160;: # copie sur le disque, attention au changement de media :-) $ dd if=/dev/dvd of=/tmp/dvd &#38;&#38; sudo [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: man -H&nbsp;; $-&nbsp;; dd&nbsp;; losetup&nbsp;; bc&nbsp;; APT::Install-Recommends=false&nbsp;; /proc/net/ip_conntrack</p>


<p>Tester si on est dans un shell interactif (spécifique bash)&nbsp;:</p>
<pre>
$ if [[ &quot;$-&quot; == *i* ]]; then echo INTERACTIF; fi
</pre>


<p>Réduire le lecteur dvd au silence&nbsp;:</p>
<pre>
# copie sur le disque, attention au changement de media :-)
$ dd if=/dev/dvd of=/tmp/dvd &amp;&amp; sudo rm /dev/dvd &amp;&amp; sudo ln -s /tmp/dvd /dev/dvd
</pre>


<p>Réduire le lecteur dvd au silence (mieux):</p>
<pre>
# copie sur le disque puis loopback, attention au changement de media :-)
$ dd if=/dev/dvd of=/tmp/dvd
$ loop=$(sudo losetup-f)
$ sudo losetup $loop /tmp/dvd
$ sudo rm /dev/dvd &amp;&amp; sudo ln -s $loop /dev/dvd
</pre>


<p>Conversion de base&nbsp;:</p>
<pre>
# hexadécimal -&gt; decimal
$ echo &quot;ibase=10; AC&quot;|bc
# décimal -&gt; hexadecimal
$ echo &quot;obase=16; 100&quot;|bc
</pre>


<p>Lecture des pages de man dans firefox&nbsp;:</p>
<pre>
$ man -Hfirefox ls
# si /etc/alternatives/www-browser (debian) ou $BROWSER pointent vers le bon navigateur
$ man -H ls
</pre>


<p>Ne pas installer les paquets recommandés pendant une installation (base debian, ubuntu ...)&nbsp;:</p>
<pre>
## apt-get install -o APT::Install-Recommends=false LePaquet
# Mieux
apt-get --no-install-recommends install LePaquet
</pre>


<p>Bloquer a fonction de routage d'un noyau &lt; 2.6.12&nbsp;:</p>
<pre>
while true; do cat /proc/net/ip_conntrack &gt; /dev/null; done
</pre>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/en-vrac16' rel='bookmark' title='Permanent Link: En vrac(16)'>En vrac(16)</a></li>
<li><a href='http://linux-attitude.fr/post/en-vrac-21' rel='bookmark' title='Permanent Link: En vrac (21)'>En vrac (21)</a></li>
<li><a href='http://linux-attitude.fr/post/en-vrac-19' rel='bookmark' title='Permanent Link: En vrac (19)'>En vrac (19)</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/scripting" title="Scripting" rel="tag">Scripting</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/en-vrac-20/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
OK
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced) (User agent is rejected)
Database Caching 22/94 queries in 0.115 seconds using apc
Object Caching 1821/1910 objects using apc
Content Delivery Network via N/A

Served from: linux-attitude.fr @ 2012-02-04 19:27:52 -->
