Category: Shell

find++ # +

Par mc, 2 août 2008 12 h 46 min

ft (#zsh@freenode) vient de me faire découvrir le + de la commande exec.
Ma joie est telle que je tiens à vous la faire partager.

pour ceux qui découvrent find:

http://wooledge.org:8000/UsingFind

Résumé des épisodes précédents:

find -zupercriter -exec rm '{} \;

c’est lent parceque ca exec autant de rm qu’il y a de fichiers. Même problème pour la boucle.

rm `find -zupercriter`

est tout sauf fiable.

Après avoir cherché avec mon ami sp3ce, j’utilise

find -zupercriter -print0 | xargs -0

depuis des années.

mais ft++ me dit que les

find

respectant POSIX ont un xargs
inside. Il suffit d’ajouter + après les arguments du exec.

ce petit plus a mis très longtemps à arriver dans le find du bovin lourd
et lent et tarde à venir a nous maintenant que GNU find est compatible
POSIX.

GNU find a aussi une option -execdir. Pas POSIX mais fort pratique.

ajout du support de readline_name dans sqlite

Par mc, 10 mai 2008 1 h 04 min

un truc que je trouve enervant dans sqlite est qu’il ne propose pas de readline_name, il n’est alors pas possible de faire des ajouts conditionnels dans son .inputrc

du genre:

$if sqlite
$include sql_abbr
$endif

je viens d’envoyer ce patch pour src/shell.c sur la liste dev.

38a39,43                                                                                                                           
> void initialize_readline(void) {                                                                                                 
>       rl_readline_name = "sqlite";                                                                                               
>       rl_attempted_completion_function = NULL;                                                                                   
>       rl_basic_word_break_characters = "\t\n@$><=;|&{( ";                                                                        
> }                                                                                                                                
2070a2076                                                                                                                          
>       initialize_readline();

En attendant que ca arrive dans debian:

apt-get source sqlite
cd **/src
patch shell.c monpatch
cd ..
dpkg-buildpackage -rfakeroot -us -uc
cd ..
dpkg -i *deb

et voilà

Doper sa productivité avec Cowsay

Par jeremy, 30 avril 2008 15 h 47 min

Cowsay est un utilitaire exceptionnel, qui permet de générer des messages à la manière d’un personnage de bande dessinée s’exprimant dans une bulle :

exemple :

$ cowsay hello
 _______
< hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||--WWW |
                ||     ||

Mais cowsay peut faire bien plus :

$ cowsay hello | ssh user@serveur "cat | wall"

N’est-ce pas une magnifique méthode de faire des annonces à ses utilisateurs en ajoutant une touche de bonne humeur ?

Si vous n’êtes toujours pas convaincus, sachez que cowsay fournit des templates pour remplacer
la vache par d’autres animaux plus…exotiques.

Pour voir tous les animaux :

for template in /usr/share/cowsay/cows/*.cow ; do echo $template ; cowsay -f $template ; done | less

Dernières infos : c’est codé en Perl, et Debian fournit des paquets.

Contrôler le screen d’un utilisateur en tant que root

Par matts, 29 avril 2008 16 h 24 min

Problème : Je suis root. Je veux contrôler le screen d’un utilisateur qui n’a pas explicitement autorisé le multiuser.

Solution :
[list]
[*] Je repère le screen de mon utilisateur :

~# ls /var/run/screen/S-monuser
pid.pts-1.machine

[*]et je le récupère :

~# sudo -u monuser screen -x pid.pts-1.machine
Cannot open your terminal '/dev/pts/0' - please check.

[*]Arg, il faut que j’ajoute les droits nécessaires à mon tty :

~# chmod go+rw /dev/pts/0
~# sudo -u monuser screen -x pid.pts-1.machine

Voilà !
[*]Et on oublie pas de remettre les droits appropriés quand on a terminé :

~# chmod 620 /dev/pts/0

[/list]

Voilà, si quelqu’un connaît une méthode plus propre…

Nettoyer sa copie de travail

Par kyusan, 16 avril 2008 10 h 15 min

Parfois avant de commiter du code sur un depot subversion, je me retrouve avec des fichiers temporaires. Pour les supprimer rapidement, j’utilise cette commande :


for I in $(svn status|awk '$1 == "?" { print $2 }'); do rm -rf $I; done

C'est assez bourrin, et ça ne pardonne pas si on a oublier de versioner un fichier :D

lsof pour chercher les ports ouverts

Par mc, 14 avril 2008 16 h 58 min

lsof permet de visualiser les fichiers ouverts (par qui? pourquoi? comment?).

Les sockets ayant un FD au même titre que les fichiers du FS, il est possible
de visualiser les connexions en cours. c’est un beau melange de ps, netstat et
d’autres … en mieux:

/!\

Le root voit des choses:

> echo `lsof -i |wc -l` `sudo lsof -i |wc -l`
7 19

exemple: afficher les fichiers ouverts par la commande squid (

-csquid

)
sur le domaine Internet (

-i

).

lsof -csquid -i

ne fonctionne pas comme nous l’attendons: il sélectionne l’un ou l’autre.
le et logique s’écrit (

-a

)

lsof -csquid -ai

Nous voulons ensuite recupérer les infos sans avoir a deduire les colonnes
(

-F

) et ne garder que les infos relatives au domaine internet
(

-FT

).

De ces données relatives au domaine internet, seul l’état nous intéresse:
(

-Fs

). Nous obtenons donc:

lsof -csquid -ai -FT -Ts

Voilà une petite fonction qui affiche uniquement les PIDs des processus en
écoute sur le domaine Internet:

# use the lsof's -F output to show PIDs that are listening
# on a internet port.
lsof_listening_pids () {
    sed -n '
 
        # when a line starts with p,
        # store the rest of the line (the PID in fact)
        # in the hold space
        /^p/ {
            s/^p//
            h
        }
 
        # when the line is
        /^TST=LISTEN$/ {
            # so call the PID back to the pattern space
            # and print it
            g
            p
        }
    '
sudo lsof -csquid -ai -FT -Ts |
   lsof_listening_pids

maintenant j’ai confiance !

de vignere en zsh

Par mc, 27 février 2008 23 h 12 min

je donne souvent cet exercice en cours de C: affichez une table de vignere a l’écran.

en zsh:

# creer un tableau de a a z 
a=({a-z})
# repeter autant de fois qu'il y a d'element dans le tableau
repeat $#a {
  # afficher le tableau
  print $a;
  # le premier devient le dernier
  a+=$a[1];
  # je supprime l'ancien premier
  a[1]=() 
}

zsh, et les tableaux

Par mc, 17 février 2008 21 h 20 min

oui … c’est vrai, perl a shift, unshift, pop et push …

mais en zsh on a la meme en utilisant les sous-tableaux:


a=( this is a )

# pop
a[-1]=()

# push
a[-1]=( $a[-1] test )

# shift
a[1]=()

# unshift
a[1]=( yeah, $a[1] )

les commandes fouries par un paquet debian

Par mc, 17 février 2008 20 h 47 min

Il m’arrive souvent d’écrire dans mon shell des lignes qui feraient de bons exos pratiques. Je ne les note jamais … Mais tout ca va changer … je vais m’améliorer .. je commence a blogger les CS pour code snippets.

soit une liste de fichiers et de repertoires (exemple: le resultat d’une commande dpkg -L ) , je veux en extraire les commandes.

Les commandes sont des fichiers ( -f ), ils sont executables ( -x ) et le nom de la commande est le basename du chemin ( $F[-1] si le separateur par defaut est ‘/’ ( -F/ -a )).

au final :

dpkg -L iproute |
perl -F/ -lane '-f && -x && print $F[-1]'

ssh: agent smith est partout

Par mc, 3 février 2008 20 h 33 min

sous debian, ssh-agent utiliise dbus et on s’habitue vite au confort de ne devoir tapper son mdp une seule fois par jour. Sous windows, c’est idem lorsqu’on lance puuty-agent au demarrage de la session.

sous les autres os, il faut faire ca a la mimine. en attendant mieux, voilà de quoi donner a manger a .profile, .zshenv et .xsession:


# does $SSH_AGENT_PID exists and is it
# correctly set ?
# use it as boolean ...
# exemple: ssh_agent_right_pid && echo ok
# tested: dash, zsh
ssh_agent_right_pid () {
# if pid exists, there are 2 lines
# so the second read returns 0
local a b
[ -n "$SSH_AGENT_PID" ] &&
ps -p $SSH_AGENT_PID | {
read a
read b
}
}

# if ssh-agent command is available on the system
# tries to launch and load a key
# in .xsession, source it before exec yourwm
if which ssh-agent > /dev/null; then
ssh_agent_right_pid || source ~/.today_agent > /dev/null
ssh_agent_right_pid || {
ssh-agent > ~/.today_agent
source ~/.today_agent > /dev/null
# open it in a term if you use this script in your .xesssion
ssh-add
}
ssh_agent_right_pid || {
echo « can’t launch agent » >&2
false
}
fi

Panorama Theme by Themocracy