Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 09/10/2012, à 20:56

Le Barde

Script shell (SH / DASH) - Bug !

Bonjour à tous,

J'installe de temps en temps une machine chez des amis. Comme il faut bien que je fasse la maintenance de temps à autre et que je n'ai pas toujours el temps de me déplacer, je fais un pont SSH qui me permet d'avoir la main à distance (non, ça ne me sert pas pour faire des choses pâ bien).
Je suis en train d'écrire un script shell pour automatiser tout ça : créer une clef RSA, configurer le serveur distant pour installer la clef publique dans ~/.ssh/authorized_keys, configurer localhost pour créer un pont à chaque démarrage ou sur commande...

Les premières bases fonctionnaient bien mais j'ai un bug. Voici le script :

#!/bin/sh

# SM (SSH Maintenance) v 1.0
# Script d'installation d'une clef ssh
# Configuration pour créer un pont ssh (-R) automatiquement
# afin de permettre un accès root sur la machine cible.
# 
# Cela vous permettra, à l'installation
# 
# Réalisé par Le Barde

VERSION=1.0

DEFAULT_HOST=serveur_distant.com
DEFAULT_USER=utilisateur_par_defaut
DEFAULT_PORT=65500



# Error codes
SSH_ERROR=10
BAD_PARAMS=11

print_title()
{
    sleep 0.5
    echo "\033[1;31m* $1\033[0m"
}

usage()
{
    cat <<_USAGE
Usage : `basename $0` [-i]
    -h   Afficher cette aide.
    -i   Installation. Modification de ~/.ssh/config en local,
          de ~/.ssh/authorized_keys sur le serveur distnat, et
          ajout du script init.
_USAGE
}

get_info()
{
    print_title "Installation d'un pont SSH vers un serveur distant"
    
    echo -n "Hôte cible ($DEFAULT_HOST) : "
    read HOST
    [ -z "$HOST" ] && HOST=$DEFAULT_HOST
    
    echo -n "Utilisateur ($DEFAULT_USER) : "
    read USER
    [ -z "$USER" ] && USER=$DEFAULT_USER
    
    echo -n "Commentaire (Défaut : 'uname -a') : "
    read COMMENT
    [ -z "$COMMENT" ] && COMMENT=`uname -a`
    
    echo -n "Port à ouvrir sur l'hôte distant ($DEFAULT_PORT) : "
    read REMOTE_PORT
    [ -z "$REMOTE_PORT" ] && REMOTE_PORT=$DEFAULT_PORT
}

gen_key()
{
    print_title "Création de la clef SSH"
    ssh-keygen -t rsa -q -C "$COMMENT - port ouvert : $REMOTE_PORT" -f rsa_id
    KEY="$USER_$HOST.key"
    PUBKEY="$KEY.pub"
    mv -v rsa_id ~/.ssh/$KEY
    mv -v rsa_id.pub ~/.ssh/$PUBKEY
}

configure_localhost()
{
    print_title "Configuration de la machine locale"
    if [ -z $BOOL_INSTALL ]; then
    {
        BOOL=Y
    }
    else
    {
        echo -n "Configuration automatique de $HOME/.ssh/config (o/N) ?"
        read BOOL
    }
    fi
    
    if [ $BOOL -eq "Y" || $BOOL -eq "y" || $BOOL -eq "O" || $BOOL -eq "o" ]; then
    {
        echo "Modification du fichier ~/.ssh/config"
        cat >> ~/.ssh/config <<EOF
Host $HOST
     Hostname $HOST
     Port 22
     User $USER
     IdentityFile ~/.ssh/$KEY
EOF
    }
    fi
    
    echo "TODO : rajouter un script ssh -R 22:localhost:$REMOTE_HOST $USER@$HOST"
}

install_remote_key()
{
    print_title "Installation de la clef sur le serveur distant"
    if [ -z $BOOL_INSTALL ]; then
    {
        echo -n "Se connecter au serveur distant pour copier la clef (o/N) ?"
        unset BOOL
        read BOOL
    }
    else
    {
        BOOL=Y
    }
    fi
    
    if [ $BOOL -eq "Y" || $BOOL -eq "y" || $BOOL -eq "O" || $BOOL -eq "o" ]; then
    {
        echo "Clef publique exportée : $(cat ~/.ssh/$PUBKEY)"
        echo "ssh $USER@$HOST ..."
        
        ssh $USER@$HOST "echo $(cat ~/.ssh/$PUBKEY) >> ~/.ssh/authorized_keys"
        
        [ $? -ne 0 ] && print_title "Erreur SSH. Abandon."; exit $SSH_ERROR
        echo "... Installation réussie !"
    }
    fi
}


connection_test()
{
    print_title "Test de la connexion : Vous ne devriez pas avoir à taper de mot de passe."
    ssh $USER@$HOST "test"
    [ $? -ne 0 ] && echo "Erreur SSH. Abandon."; exit $SSH_ERROR
}




#
# main()
#

if [ $# -ge "1" ]; then
{
    for i in `seq 1 $#`; do
    {
        case $1 in
            -i | --install) BOOL_INSTALL="1";;
            -h | --help) usage;;
            *) echo "$1 : Mauvais argument"; usage; exit $BAD_PARAMS ;;
        esac
        
        shift
    }
    done
}
fi


sleep 0.5
echo "\033[1;32mSSH Maintenance version $VERSION\033[0m"
# Get the vars : HOST, USER and COMMENT
get_info

# Generate the RSA keys to install on localhost and remote host.
gen_key

# Configure the local machine to automatically make a bridge.
configure_localhost

# Install the RSA key on remote host
install_remote_key

# Testing the connection
connection_test

exit 0;

C'est ici notamment que ça pose problème :

    print_title "Installation de la clef sur le serveur distant"
    if [ -z $BOOL_INSTALL ]; then
    {
        echo -n "Se connecter au serveur distant pour copier la clef (o/N) ?"
        unset BOOL
        read BOOL
    }
    else
    {
        BOOL=Y
    }
    fi
    
    if [ $BOOL -eq "Y" || $BOOL -eq "y" || $BOOL -eq "O" || $BOOL -eq "o" ]; then
    {
        echo "Clef publique exportée : $(cat ~/.ssh/$PUBKEY)"
        echo "ssh $USER@$HOST ..."
        
        ssh $USER@$HOST "echo $(cat ~/.ssh/$PUBKEY) >> ~/.ssh/authorized_keys"
        
        [ $? -ne 0 ] && print_title "Erreur SSH. Abandon."; exit $SSH_ERROR
        echo "... Installation réussie !"
    }
    fi

Ça me donne les erreurs suivantes :

dash a écrit :

* Configuration de la machine locale
./install-maintenance: 86: [: missing ]
./install-maintenance: 86: ./install-maintenance: Y: not found
./install-maintenance: 86: ./install-maintenance: Y: not found
./install-maintenance: 86: ./install-maintenance: Y: not found

Puis :

dash a écrit :

./install-maintenance: 117: [: missing ]
./install-maintenance: 117: ./install-maintenance: n: not found
./install-maintenance: 117: ./install-maintenance: n: not found
./install-maintenance: 117: ./install-maintenance: n: not found

Par ailleurs (pas encore essayé), si quelqu'un a des idées pour installer automatiquement un script dans /etc/init.d et le configurer avec update-rc.d, je suis preneur ! Il faut pour cela soit le faire avec sudo, soit avec su, selon la distribution GNU/Linux. Mais ceci est une autre histoire, qui sera peut-être contée une autre fois (dans Vos scripts utiles ?).

Tchô.

Hors ligne

#2 Le 09/10/2012, à 21:04

sputnick

Re : Script shell (SH / DASH) - Bug !

Salut,

normal, la syntaxe

 if [ $BOOL -eq "Y" || $BOOL -eq "y" || $BOOL -eq "O" || $BOOL -eq "o" ]; then

n'existe pas.

Si tu fais du sh, il faut faire :

 if [ $BOOL -eq "Y" -o $BOOL -eq "y" -o $BOOL -eq "O" -o $BOOL -eq "o" ]; then

Sinon en bash :

 if [[ $BOOL -eq "Y" || $BOOL -eq "y" || $BOOL -eq "O" || $BOOL -eq "o" ]]; then

bashfr.org(random);
<arciks1994> dou tu connai qel age j'ai ?

Hors ligne

#3 Le 09/10/2012, à 21:40

Le Barde

Re : Script shell (SH / DASH) - Bug !

Merci beaucoup.

J'ai modifié comme suit :

    print_title "Configuration de la machine locale"
    if [ -z $BOOL_INSTALL ]; then
    {
        BOOL="Y"
    }
    else
    {
        echo -n "Configuration automatique de $HOME/.ssh/config (o/N) ?"
        read BOOL
    }
    fi
    
    if [ "$BOOL" = "Y" -o "$BOOL" -eq "y" -o "$BOOL" -eq "O" -o "$BOOL" -eq "o" ]; then

On me dit maintenant :

sh a écrit :

./install-maintenance: 86: [: Illegal number: Y

¡ No entiendo !

Hors ligne

#4 Le 09/10/2012, à 22:04

Le Barde

Re : Script shell (SH / DASH) - Bug !

C'est bon, je m'étais trompé dans le test du if : pour comparer deux chaînes, c'est le signe égal (=). Le -eq n'est bon que pour comparer des entiers (ça marche pour des entiers relatifs).

Hors ligne

Haut de page ↑