Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archives pour septembre, 2009

Niveau : Star Star Star Star Empty
Résumé :alias ssh='ssh macommande && ssh'

Aujourd'hui interceptons les commandes ssh. Alors ne commencez pas à penser que je suis passé du côté obscur de la force. Il y a des usage bien pratique ce script et je vous en proposerai un dans le prochain article.

Tout d'abord le problème : on veut pouvoir intercepter une commande ssh de façon silencieuse pour pouvoir utiliser la connexion qui va s'établir et lancer les commandes qu'on veut sur la machine distante. Cela implique une acceptation implicite de l'utilisateur puisqu'on va utiliser un simple alias pour "intercepter" la commande. Bien sûr rien ne vous empêche de modifier l'alias d'un ami selon les moyens qui sont à votre disposition ;-)

Principe de fonctionnement

Vous vous dites qu'il suffit de reprendre les paramètres de la commande et de la relancer. Non, habitués que vous êtes à l'agent ssh, vous avez oublié qu'en son absence l'utilisateur devra taper un mot de passe pour que la commande passe.

Pour récupérer la connexion ssh, openssh met à notre disposition tout ce qu'il faut. L'option s'appelle ControlMaster, elle crée une socket sur laquelle ssh peut ensuite se connecter pour ouvrir un nouveau terminal sans repasser toute la chaine de connexion au serveur.

La méthode est donc fait simple :

  • on intercepte la commande ssh (alias)
  • on lance notre script en background ($0 &)
  • on ajoute un option -M et -S si besoin à la commande ssh pour créer la socket
  • on garde les options originales et le processus original (exec ssh -M -S "$@")
  • dans le script en background on peut ensuite utiliser directement la socket en question pour faire ce qu'on veut

Résultat

Donc résumons : un alias

alias ssh='~/.sshalias'

Et un script nommé ~/.sshalias (commentaires en anglais par habitude). Modifiez la commande run pour metre ce que vous voulez dedans

#!/bin/sh

# GPLv2 
# author : peck

#  command tu run via the ssh socket
run()
{
        # example ssh command
        ssh -S "$1" XXX 'hostname'
}

# test if we are the child which can connect via the master
if [ "$1" == "-=0" ]
then
    go=0
    # limit to 60 retries x 1s
    for i in $(seq 1 60)
    do
        sleep 1
        # try to connect via master
        ssh -S "$2" -O check xxx 2>/dev/null
        if [ $? -eq 0 ]
        then
            go=1
            break
        fi
    done
    # run the stealth command
    if [ $go -eq 1 ]
    then
        sleep 1 # bug if we go too fast
        run "$2"
    fi
    # remove master socket if we created it
    if [ "$3" == "0" ]
    then
        rm -f "$2"
    fi
    exit 0
fi

# we are in a real ssh command
master=0
sock=""
for i in "$@"
do
    # test if master is already provided
    if [ "$i" == "-M" ]
    then
        master=1
    fi
    # retrieve socket if provided
    if [ "$i" == "-S" ]
    then
        sock=".";
    fi
    if [ "$i" == "." ]
    then
        sock="$i"
    fi
done

# create socket name if needed
if [ "$sock" == "" ]
then
    sock=$(mktemp -u -t sshx.XXXXXX)
fi

# launch child which will use our master socket
$0 -=0 "$sock" "$master" &

# run original command adding a master socket
if [ $master -eq 1 ]
then
    exec ssh "$@"
else
    exec ssh -S "$sock" -M "$@"
fi

Ceci est un article invité, regardez en haut à gauche le nom de l'auteur ...

Niveau : Star Star Star Empty Empty
Résumé :

Peut-être avez-vous déjà rêvé, lors de vos soirées d'été, de contrôler votre musique à distance avec votre téléphone portable dernière génération, ou tout simplement en étant gentiment assis dans votre chaise longue ? MPD peut être la solution.

Music Player Daemon (MPD)

MPD fait partie de cette famille de lecteurs de musique basés sur un modèle client/serveur (dans la même catégorie se trouve xmms2 par exemple). Globalement, le serveur lit les fichiers audio sur la machine hôte, et vous pouvez contrôler à distance (et bien sûr localement) la musique à diffuser. Ainsi, il faut bien comprendre que les seuls messages qui transitent sur le réseau sont des messages de contrôle, et qu'aucun streaming audio n'est mis en jeu.

Les intérêts d'un tel modèle sont :

  • bien sûr, le contrôle à distance par plusieurs machines
  • la lecture de musique indépendante de tout lecteur nécessitant un serveur X
  • le logiciel de contrôle (qu'on pourrait à tord appeler "lecteur") n'a pas à se soucier des divers plugins nécessaires à la lecture des fichiers audio ou encore de gérer la bibliothèque. MPD le fait déjà pour lui.

L'un des principaux désavantages est que cela rajoute un poil de complexité lorsqu'un simple "play music.mp3" peut lire un fichier audio, mais les avantage sus-cités méritent de s'y essayer.

Installation

Sous Debian et dérivés, tout simplement faire en tant que root :

$ aptitude install mpd

Il va ensuite falloir configurer votre nouveau joujou. On se basera pour l'exemple sur la configuration par défaut du paquet Debian, mais le tout peut être adapté pour d'autres distributions. Le fichier de configuration /etc/mpd.conf contient des informations sur, entre autres, :

  • le répertoire où se trouve toute votre musique. Par défaut, sous Debian, il se trouve dans /var/lib/mpd/music
  • l'utilisateur sous lequel tourne le daemon (mpd par défaut, toujours sous Debian). Je conseillerai de laisser cet utilisateur crée par le paquet, et de ne pas mettre root...
  • l'adresse de bind du serveur. "127.0.0.1" par défaut, à adapter si vous voulez contrôler votre daemon à distance ("0.0.0.0" par exemple)
  • contrôle d'accès sur la gestion de la playlist, la lecture de la bilbiothèque, etc... par mot de passe (se référer au man pour plus d'infos.)

Certains d'entre vous se demandent peut être comment faire si sa musique est répartie entre deux disques durs, ou plusieurs montages NFS, que sais-je... MPD supporte les liens symboliques lors de la recherche de fichiers audios (comportement contrôlable grâce aux variables follow_outside_symlinks et follow_inside_symlinks du fichier de configuration). Donc, imaginons que vous ayez de la musique en local sur votre machine, et sur votre disque dur externe USB. Vous pouvez donc faire quelque chose comme :

$ sudo -u mpd ln -s /mnt/files/Musique /var/lib/mpd/music/local
$ sudo -u mpd ln -s /mnt/dd_externe/Musique /var/lib/mpd/music/dd

Il faut ensuite générer la base de données initiale. Vous pouvez définir dans le fichier de configuration les tags à extraire de vos fichiers audio pour constituer la bibliothèque finale de MPD, grâce à la variable metadata_to_use. Ensuite, le script d'init du paquet debian a été prévu pour lancer la génération. Il suffit donc de faire, en tant que root :

# S'assurer que mpd soit arrêté
$ invoke-rc.d mpd stop
# Et c'est parti
$ invoke-rc.d mpd start-create-db

Pour information, cette base de données est stockée par défaut (sous Debian) dans /var/lib/mpd/tag_cache, chemin modifiable dans /etc/mpd.conf.

Vous pouvez ensuite suivre l'avancement de la recherche en regardant le fichier de log de mpd :

# Les logs de mpd sont en 0644, donc pas forcément besoin d'être root
$ tail -f /var/log/mpd.log
Alsa et ses amis qui font du bruit

Une autre option de MPD est qu'il peut diffuser votre musique sur plusieurs systèmes. Le tout se passe toujours dans /etc/mpd.conf, dans la rubrique "Audio Output".

Si vous utilisez Alsa, il faut faire attention à la configuration de ce dernier et permettre à plusieurs utilisateur d'accéder au mixeur d'alsa. En effet, le daemon MPD tourne sous l'user mpd, et, par exemple, votre navigateur web sous votre user habituel. Alors, si vous voulez toujours entendre le doux son de deezer, il faut que votre /etc/asound.conf (ou ~/.asound.conf suivant votre configuration) ressemble à ceci :

$ cat /etc/asound.conf
pcm.mixeur {
   type dmix
   ipc_key 1024    # must be unique!
   ipc_key_add_uid false  # do not add uid to unique IPC key :: cette ligne est importante
   ipc_perm 0660  # allow multiple users to use the same IPC :: et celle-ci aussi
   slave {
       pcm "hw:0,0"
       period_time 0
       period_size 1024
       buffer_size 16384
       rate 44100
   }
}
pcm.!default {
   type plug
   slave.pcm "mixeur"
}

Il faut aussi bien vérifier que votre utilisateur appartienne au groupe audio. Pour cela :

$ id
# devrait afficher "audio" dans la liste des groupes

Le cas échéant, faire en tant que root un :

$ adduser votre_login audio

et vous reloguer.

Vous pouvez aussi diffuser la sortie de MPD en streaming. Le fichier de configuration donne un exemple assez parlant.

Les clients MPD

Le wiki officiel de MPD nous donne une liste plus ou moins exhaustive des clients MPD disponibles. Il y en a pour tous les goûts, de l'adepte du curseur clignotant au fan des interfaces graphiques Qt. Il y a même des clients pour Windows Mobile, pour pouvoir contrôler votre musique depuis votre transat grâce à votre Smartphone ou PDA en Wifi (ou en IPv6 over 3G, un jour, peut-être).

Pour ma part, j'ai essayé pympd. À part le manque de contrôle du volume interne de MPD, il s'en sort pas trop mal : recherche dans la bibliothèque par tags, affichage de l'arborescence initiale (ce qui peut être pratique si comme moi votre musique est déjà rangée par genre/artiste/album/année) et bien sûr contrôle de la playlist. La playlist est bien sûr gérée par le serveur, et modifier la playlist grâce à un client MPD fera que les autres client éventuellement connectés verront la modification.

Niveau Windows Mobile, mobilempd.net, bien qu'un peu lent au démarrage, fait bien son travail.

Par exemple, vous pouvez aussi utiliser le client en ligne de commande mpc pour contrôler MPD grâce à des raccourcis claviers :

# Play/pause
$ mpc toggle
# Chanson suivante
$ mpc next
# Stop
$ mpc stop

Je vous laisse ici donner vos impressions sur les clients que vous avez pu tester.

Conclusion

Cette article se veut comme une introduction à MPD, avec les quelques problèmes que j'ai pu rencontrer notamment au niveau d'ALSA. Je ne peux que vous conseiller de regarder plus en profondeur en n'hésitant pas à regarder le fichier de configuration de Debian assez bien commenté, ainsi que son man (man mpd.conf).

Je tiens à remercier peck pour son beau travail sur ce site et pour m'avoir laisser m'exprimer.

Cet article continue prochainement avec l'ajout de Jack dans le lot, pour un contrôle plus fin du son de vos enceintes. Parce que vos oreilles le valent bien.