Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/10/2012, à 21: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, à 22: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

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#3 Le 09/10/2012, à 22: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, à 23: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