Interception silencieuse de ssh
Niveau :
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 "$@" fiTags:Commande, planet-libre, Ssh