Posts SSH non-interactive impossible sur Ubuntu
Post
Cancel

SSH non-interactive impossible sur Ubuntu

Impossible de faire un rsync en cron qui utilise un clé SSH alors que le script fonctionne bien quand on le lance manuellement

TL;DR : Il faut créer une clé SSH sans passphrase dédiée à la tâche cron avec ssh-keygen -t rsa et lancer SSH avec l’option -i qui pointe vers la clé RSA sans passphrase.


Ca fait quelque temps que j’ai ce problème qui traine dans mes tiroirs, et ce soir j’ai enfin trouvé une solution !

Le problème

J’ai un script sh qui fait un rsync d’une machine distante via SSH. Quelque chose dans ce genre :

1
2
#!/bin/bash
rsync -e ssh -a user@123.456.789.123:/dossier/a/sauvegarder /home/nico/backup 

Quand je lance le script en faisant…

1
$ sh monscript.sh

…rsync ne me demande pas de mot de passe pour la connexion SSH parce que j’ai ma clé publique qui est bien enregistrée dans le fichier ~/.ssh/authorized_keys qui se trouve sur la machine distante pour l’user user.

La clé publique était générée par défaut (de mémoire), par Ubuntu et/ou Gnome-keyring.

Jusque là, tout va bien. Le script fonctionne très bien sans me demander aucun mot de passe.

Mon problème, c’est quand j’essaye d’automatiser l’éxecution de mon backup. Par exemple, je voudrais qu’il se lance toutes les 30 minutes.

1
$ crontab -e

… et j’ajoute cette ligne :

1
*/30 * * * * sh ~/monscript.sh

Malheureusement, ça ne fonctionne pas. Pour comprendre d’où vient le problème, j’enregistre des logs pour savoir ce qu’il se passe.

1
*/30 * * * * sh ~/monscript.sh > ~/logs.txt 2>&1

Et je n’en apprend malheureusement pas beaucoup plus. A part que la connexion SSH est refusée.

Pour en savoir plus, je demande à rsync de rendre ssh un peu plus bavard dans mon script en ajoutant l’option -vv à la commande ssh (et des apostrophes autour de la commande 'ssh -vv'):

1
2
#!/bin/bash
rsync -e 'ssh -vv' -a user@123.456.789.123:/dossier/a/sauvegarder /home/nico/backup 

C’est comme ça que j’ai pu obtenir le détail de l’erreur SSH :

1
read_passphrase: can't open /dev/tty

J’ai essayé plusieurs choses pour que SSH accepte de se logger en utilisant ma clé SSH :

  • l’option -T
  • l’option -o StrictHostKeyChecking=no
  • l’option -i /home/nico/.ssh/id_rsa

…Mais aucun changement. En fait le problème était ailleurs. Si j’ai bien compris, le problème, c’est que ma clé SSH était générée avec une passphrase gérée par Gnome-Keyring. Du coup, c’est transparent quand je fais une connexion SSH via la console. Mais quand j’essaye de faire une connexion SSH en mode non-interactive (comme c’est le cas pour une tâche CRON), alors la passphrase n’est pas communiquée à la tâche CRON car aucune interface gnome n’y est liée.

la solution

Pour éviter ça, le seul moyen qui était à ma portée, était de générée une nouvelle clé SSH sans passphrase :

1
2
3
4
5
6
7
8
$ ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/nico/.ssh/id_rsa): 
# /home/nico/.ssh/id_rsa_sans_passphrase
Enter passphrase (empty for no passphrase): 
# Laisser vide

Après ça, il ne reste plus qu’à :

  • ajouter ma nouvelle clé publique dans le fichier ~/.ssh/authorized_keys sur la machine distante.
  • expliquer à SSH dans ma commande rsync qu’il faut utiliser cette clé sans passphrase plutôt que d’utiliser la clé par défaut ~/.ssh/id_rsa. Pour ce faire, on met simplement l’option -i à la commande ssh.
1
2
#!/bin/bash
rsync -e 'ssh -i /home/nico/.ssh/id_rsa_sans_passphrase' -a user@123.456.789.123:/dossier/a/sauvegarder /home/nico/backup 

…and voilà. Ma synchro fonctionne enfin automatiquement sans me demander de mot de passe.

Voici la page qui a fini par me donner la vraie réponse à mon problème :

Article sous licence CC BY NC ND 4.0.