<?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>Trux &#187; shell</title>
	<atom:link href="http://trux.info/tag/shell/feed/" rel="self" type="application/rss+xml" />
	<link>http://trux.info</link>
	<description>Partage de mes astuces et découvertes</description>
	<lastBuildDate>Tue, 09 Jun 2009 19:47:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Débuts avec zsh</title>
		<link>http://trux.info/2009/01/debuts-avec-zsh/</link>
		<comments>http://trux.info/2009/01/debuts-avec-zsh/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 19:56:09 +0000</pubDate>
		<dc:creator>chris</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[zsh]]></category>

		<guid isPermaLink="false">http://trux.info/?p=62</guid>
		<description><![CDATA[zsh est un shell complet qui remplace avantageusement bash dont on entend beaucoup parler en bien. J&#8217;ai décidé de l&#8217;essayer récemment.
Sans chercher à exploiter toutes les fonctionnalités qu&#8217;il propose, certaines facilités me sont maintenant indispensables lorsque je passe à bash. Une seule en fait : le ** qui se substitue à n&#8217;importe quel dossier ou [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cooking2000.com/fr/dossier/coquille-saint-jacques.htm"><img alt="" src="http://www.cooking2000.com/image/dossier/divers/coquille-st-jacques.jpg" title="shell signifie aussi coquille, ici une St Jacques" class="alignright" width="200" height="257" /></a><code>zsh</code> est un <a href="http://fr.wikipedia.org/wiki/Shell_(informatique)">shell</a> complet qui remplace avantageusement <code>bash</code> dont on entend <a href="http://doc.ubuntu-fr.org/zsh">beaucoup parler</a> en bien. J&#8217;ai décidé de l&#8217;essayer récemment.</p>
<p>Sans chercher à exploiter toutes les fonctionnalités qu&#8217;il propose, certaines facilités me sont maintenant indispensables lorsque je passe à bash. Une seule en fait : le <code>**</code> qui se substitue à n&#8217;importe quel dossier ou sous-dossier. Un <a href="http://en.wikipedia.org/wiki/Glob_(programming)">globbing</a> puissant qui permet de s&#8217;affranchir de <a href="http://pwet.fr/man/linux/commandes/find">find</a>.</p>
<p><span id="more-62"></span></p>
<pre>
# liste tous les fichiers, equivalent de find .
ls **/*
# recherche la chaine 'foo' dans tous les fichiers java
grep foo **/*.java
# recherche la chaine 'bar' dans tous les fichiers java qui ont pour
# repertoire parent le dossier src
grep foo **/src/**/*.java
</pre>
<p>De plus, on peut ajouter des options de recherche</p>
<pre>
# tous les fichiers contenant le nom 'dupont' en Ignorant la casse
# correspond à dupond, DUPOND, Dupond, DuPOnD, mais pas Durand
ls (#i)dupont
# liste uniquement les fichiers
ls **/*(.)
# liste uniquement les dossiers
ls -d **/*(/)
# liste tous les dossiers pleins (Full)
ls -d **/*(F)
# liste tous les dossiers vides (not Full)
ls -d **/*(^F)
</pre>
<p>Il existe <a href="http://www.manpagez.com/man/1/zshexpn/">beaucoup d&#8217;autres possibilités</a>, mais juste ces quelques commandes m&#8217;ont permis de m&#8217;affranchir du sempiternel <code>find . -type f -iname "*dupont*" | xargs svn revert</code>.</p>
<p>L&#8217;autre truc bien de zsh, évidemment, c&#8217;est l&#8217;aide à la <a href="http://zsh.sourceforge.net/Guide/zshguide06.html">complétion de commande</a>. Il est remarquable dans bien des cas, notamment</p>
<ul>
<li>tâches ant : <code>$ ant &lt;TAB&gt;</code> => liste les tâches ant disponibles</li>
<li>arguments ant : <code>$ ant --n&lt;TAB&gt;</code> => liste les options de ant commençant par <i>&#8211;n</i></li>
<li>adresses svn : <code>$ svn checkout http://some.svn.server/svn/trunk/src/&lt;TAB&gt;</code> => liste les fichiers disponibles</li>
</ul>
<p>Bref ça vaut le coup d&#8217;essayer. Pour mettre un pied à l&#8217;étrier (et me servir d&#8217;aide mémoire), voici le <code>.zshrc</code> que j&#8217;utilise. Il n&#8217;a rien d&#8217;exceptionnel, même le prompt est des plus basiques.</p>
<pre>
# Lines configured by zsh-newuser-install
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt appendhistory autocd extendedglob nomatch notify
unsetopt beep
bindkey -e
# End of lines configured by zsh-newuser-install
# The following lines were added by compinstall
zstyle :compinstall filename '/home/cbliard/.zshrc'

autoload -Uz compinit
compinit
# End of lines added by compinstall

# Add ~/bin directory to PATH if possible
[ -d $HOME/bin ] &#038;&#038; export PATH=$PATH:$HOME/bin

# colors
eval "`dircolors -b`"
alias ls='ls --color=auto'

function l() {
	clear; pwd; echo; ls -lh $*; echo
}

# Set up aliases
alias mv='nocorrect mv'       # no spelling correction on mv
alias cp='nocorrect cp'       # no spelling correction on cp
alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
alias grep='egrep --exclude-dir=\.svn --color=auto'
alias ll='ls -l'
alias la='ls -a'
alias less='less -i'
alias diff='diff -u -x .svn'

# Less verbose ant
alias ant='ant -logger org.apache.tools.ant.NoBannerLogger'

# List only directories and symbolic
# links that point to directories
alias lsd='ls -ld *(-/DN)'

# List only file beginning with "."
alias lsa='ls -ld .*'

# Simple bold prompt
PROMPT="%{%B%}%n@%m:%~%{%b%}%# "

# select words as in bash (for Meta-backspace and Meta-d)
autoload -U select-word-style
select-word-style bash
</pre>
]]></content:encoded>
			<wfw:commentRss>http://trux.info/2009/01/debuts-avec-zsh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utiliser rubygems avec Netbeans sur Ubuntu grâce aux ACLs</title>
		<link>http://trux.info/2008/12/utiliser-rubygems-avec-netbeans-sur-ubuntu-grace-aux-acls/</link>
		<comments>http://trux.info/2008/12/utiliser-rubygems-avec-netbeans-sur-ubuntu-grace-aux-acls/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 08:00:06 +0000</pubDate>
		<dc:creator>chris</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[acl]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://trux.info/?p=29</guid>
		<description><![CDATA[En installant rubygems et en l&#8217;utilisant avec Netbeans, on se rend vite compte que rubygems est configuré pour stocker ses gemmes dans /var/lib/gems et que Netbeans n&#8217;a pas les droits d&#8217;écriture à cet endroit. En effet, la manière traditionnelle d&#8217;installer gem implique d&#8217;utiliser sudo, en ligne de commande :
$ sudo gems install rails -y
Oui mais [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-32" title="netbeans_ruby_debian" src="http://trux.info/wp-content/uploads/2008/12/netbeans_ruby_debian.png" alt="" width="300" height="83" />En installant rubygems et en l&#8217;utilisant avec <a href="http://www.netbeans.org/">Netbeans</a>, on se rend vite compte que rubygems est configuré pour stocker ses gemmes dans <code>/var/lib/gems</code> et que Netbeans n&#8217;a pas les droits d&#8217;écriture à cet endroit. En effet, la manière traditionnelle d&#8217;installer gem implique d&#8217;utiliser sudo, en ligne de commande :</p>
<pre>$ sudo gems install rails -y</pre>
<p>Oui mais voilà, Netbeans n&#8217;utilise pas sudo. Pour que Netbeans puisse gérer les gemmes lui-même, il lui faut donc les droits d&#8217;écriture sur le dossier <code>/var/lib/gems</code> et ses sous-répertoires. Le plus naïf est de donner tous les droits en écriture, mais c&#8217;est mal ! Sinon, on peut aussi créer un groupe nommé <code>rubygems</code> et donner le droit d&#8217;écriture à ce groupe. Cette approche est meilleure mais un problème se pose lorsque l&#8217;utilisateur y crée un nouveau fichier ou dossier : non seulement celui-ci appartient à l&#8217;utilisateur et non pas à root, mais en plus le groupe n&#8217;a pas le droit d&#8217;écriture. C&#8217;est là qu&#8217;interviennent les ACLs&#8230;</p>
<p><span id="more-29"></span></p>
<h3>Démonstration avec l&#8217;utilisateur foo.</h3>
<p>On crée un groupe ruby gems et on s&#8217;y ajoute</p>
<pre>
$ sudo addgroup rubygems
$ sudo adduser foo rubygems
</pre>
<p>On se déconnecte puis reconnecte pour prendre en compte le nouveau groupe, puis on vérifie les permissions</p>
<pre>
$ sudo mkdir /test
$ sudo chgrp rubygems /test
$ sudo chmod g+w /test
$ ls -ld /test
drwxrwxr-x 2 root rubygems 4096 2008-12-03 22:16 /test
$ touch /test/bar
$ ls -l /test/bar
-rw-r--r-- 1 foo foo 0 2008-12-03 22:21 /test/bar
</pre>
<p>Ce n&#8217;est pas bon du tout. On préférerait avoir quelque chose comme <code>-rw-rw-r-- 1 foo rubygems</code> afin que les autres membres du groupe <code>rubygems</code> puissent eux aussi modifier ce fichier. De manière plus générale, on veut que :</p>
<ul>
<li>le groupe soit <code>rubygems</code> ;</li>
<li>les permissions du groupe soient rwx pour un dossier et rw- pour un fichier ;</li>
<li>et que les permissions des autres soient r-x pour un dossier et r&#8211; pour un fichier.</li>
</ul>
<p>La partie qui va suivre est issu des connaissances acquises grâce à l&#8217;article <a href="http://www.udel.edu/topics/os/unix/general/groupsharing.html">Group sharing a directory</a>.</p>
<h3>Attribuer le groupe automatiquement</h3>
<p>Il est simple d&#8217;affecter le groupe <code>rubygems</code> automatiquement à chaque nouveau dossier créé dès qu&#8217;on connait l&#8217;astuce : il suffit de lever le bit &#8217;set groupid&#8217; du groupe du dossier pour que tout nouveau fichier ou dossier créé appartienne au groupe du dossier parent plutôt qu&#8217;au groupe de l&#8217;utilisateur</p>
<pre>
$ sudo chmod g+s /test
$ ls -ld /test
drwxrwsr-x 2 root rubygems 4096 2008-12-05 07:54 /test
$ touch f
$ mkdir /test/d
$ ls -l /test
total 4
drwxr-sr-x 2 foo rubygems 4096 2008-12-05 07:59 d
-rw-r--r-- 1 foo rubygems    0 2008-12-05 07:59 f
$ cd /test/d
$ touch bar
$ ls -l
-rw-r--r-- 1 foo rubygems 0 2008-12-05 08:00 bar
</pre>
<h3>Permettre l&#8217;écriture au groupe automatiquement </h3>
<p>Cette solution fait usage des ACLs. La commande</p>
<pre>
$ sudo setfacl -m default:user::rwx,default:group::rwx,default:mask:rwx,default:other:r-x /test
</pre>
<p>permet de définir les permissions par défaut pour les futurs fichiers du dossier <code>/test</code>. La commande est longue et peut être abrégée en</p>
<pre>
$ sudo setfacl -m d:u::rwx,d:g::rwx,d:m:rwx,d:o:r-x /test
</pre>
<p>Si la commande <code>setfacl</code> ne fonctionne pas, c&#8217;est parce que l&#8217;option <code>acl</code> n&#8217;est pas active pour votre volume. Assurez-vous d&#8217;avoir une ligne qui ressemble contienne l&#8217;option <code>acl</code> dans votre <code>/etc/fstab</code> :</p>
<pre>
/dev/hda2 / ext3 defaults,acl 0 1
</pre>
<p>Ensuite remontez votre volume pour prendre en compte les modifications</p>
<pre>
sudo mount / -o remount
</pre>
<p>Observons maintenant d&#8217;un peu plus près la définition d&#8217;ACLs</p>
<pre>
$ sudo setfacl -m d:u::rwx,d:g::rwx,d:m:rwx,d:o:r-x /test
$ ls -ld /test
drwxrwsr-x+ 3 root rubygems 4096 2008-12-05 07:59 /test
$ getfacl /test
getfacl: Removing leading '/' from absolute path names
# file: test
# owner: root
# group: rubygems
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:mask::rwx
default:other::r-x
</pre>
<p>Le + à droite des permissions affichées par la commande <code>ls</code> indique qu&#8217;il y a des permissions supplémentaires visibles par <code>getfacl</code>. Ce dernier permet d&#8217;afficher les permissions définies avec <code>setfacl</code>. Essayons de créer des fichiers.</p>
<pre>
$ cd /test
$ touch polop.txt
$ mkdir hello
$ ls -l
total 16
drwxr-sr-x  2 foo rubygems 4096 2008-12-05 08:00 d
-rw-r--r--  1 foo rubygems    0 2008-12-05 07:59 f
drwxrwsr-x+ 2 foo rubygems 4096 2008-12-05 08:17 hello
-rw-rw-r--+ 1 foo rubygems    0 2008-12-05 08:17 polop.txt
$ getfacl hello
# file: hello
# owner: foo
# group: rubygems
user::rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:group::rwx
default:mask::rwx
default:other::r-x
</pre>
<p>Les ACLs ont bien rempli leur rôle : les nouveaux fichiers créés ont la permission d&#8217;écriture pour le groupe et ont aux aussi les ACLs définis (notez le +).</p>
<h3>Application au dossier de gemmes de ruby</h3>
<p>Il nous faut définir le groupe les permissions pour tout fichier ou dossier existant du dossier <code>/var/lib/gems</code> et les ACLs ainsi que le &#8217;set groupid&#8217; bit pour tout dossier, sans oublier de changer le groupe pour qu&#8217;il devienne <code>rubygems</code>.</p>
<pre>
$ sudo chgrp -R rubygems /var/lib/gems
$ sudo chmod -R -s,g=rwX,o=rX /var/lib/gems
$ for dir in $(find /var/lib/gems -type d) ; do
> sudo chmod g+s "$dir"
> sudo setfacl -m d:u::rwx,d:g::rwx,d:o:r--,d:m:rwx "$dir"
> done
</pre>
<p>notez que si vous étiez sous <a href="http://fr.wikipedia.org/wiki/Zsh">zsh</a>, vous auriez pu écrire</p>
<pre>
$ sudo chgrp rubygems /var/lib/gems/**/*
$ sudo chmod -s,g=rwX,o=rX /var/lib/gems/**/*
$ sudo chmod g+s /var/lib/gems/**/*(/)
$ sudo setfacl -m d:u::rwx,d:g::rwx,d:o:r--,d:m:rwx /var/lib/gems/**/*(/)
</pre>
<p>Voilà ! désomais vous pouvez taper</p>
<pre>
$ gems install rails -y
</pre>
<p>en simple utilisateur, ce qui signifie que d&#8217;autres programmes tiers comme NetBeans peuvent également installer des gemmes.</p>
<h3>Autres applications</h3>
<p>On peut trouver d&#8217;autres application très utiles au partage de dossier par ACL. Comme ça de tête :</p>
<ul>
<li>Quand votre serveur web est partagé entre plusieurs personnes, partager le dossier <code>/var/www</code> d&#8217;apache pour que l&#8217;utilisateur système <code>www-data</code> ait le droit d&#8217;écriture sur tous les fichiers sans donner ces droits à tout le monde ;</li>
<li>Partager des fichiers sur un disque dur externe pour que chacun puisse y gérer ses films et photos sans se retrouver bloqué quand on veut déplacer ou supprimer certains éléments créés par d&#8217;autres utilisateurs.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://trux.info/2008/12/utiliser-rubygems-avec-netbeans-sur-ubuntu-grace-aux-acls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

