Pages : 1
#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 :
* 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 :
./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
Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. Confucius
https://sputnick.fr
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 :
./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