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 10/12/2020, à 11:21

Sandro11

reverse SSH (via sshpass) : échoue lorsque lancé depuis rc.local

Bonjour,
Je travaille sur un robot basé sur un ordinateur Jetson Xavier AGX developper kit (c'est un peu comme un raspberry pi, mais de la puissance d'un ordi de gamer), sous Ubuntu 18.04.
Pour pouvoir y accéder à distance, j'utilise une clé 4G.
Vu qu'une clé 4G n'est pas sur le même réseau local, et n'a pas d'IP publique, je ne peux pas me connecter directement au robot en ssh.
La solution que j'ai trouvée est le reverse SSH via un serveur (VPS à 5€/mois, sous ubuntu 20.4, adresse IP4 publique et fixe) : ke robot se connecte au serveur, et depuis mon ordinateur, je me connecte en SSH au serveur puis depuis celui-ci en reverse SSH au robot.

NB : toutes les connections SSH se font par mot de passe

Quand sur le robot, je lance manuellement la connexion vers le serveur, tout fonctionne. En revanche, je n'arrives pas à lancer la connexion ddu robot vers le serveur automatiquement depuis rc.local

Sur le robot, j'ai :
/home/xavier0/launch_reverse_ssh.sh   avec autorisations -rwxrwxrwx, propriétaire xavier0 , qui contient :

# !/bin/sh
sshpass -p MOT_DE_PASSE ssh -NR 10000:localhost:22 user0@IP_DE_MON_SERVEUR &

/etc/rc.local  avec autorisations -rwxr-xr-x , propriétaire root, qui contient

#!/bin/bash
(sleep 120 & su - xavier0 -c /home/xavier0/launch_reverse_ssh.sh >/home/xavier0/ssh_for_reverse.log 2>&1 )&
#quelques autres lignes (mais celle pour le ssh est la première)
exit 0

Depus le serveur, je lance :

ssh -p 10000 boroboxavier0@localhost

Les tests effectués (sauf indication contraires, lancé en tant qu'utilisateur xavier0) :
- lorsque je lance ~/launch_reverse_ssh.sh : tout se passe bien, j’arrive à me connecter au robot depuis le serveur
- lorsque je lance sudo /etc/rc.local : idem, tout se passe bien (sauf erreur de ma part, rc.local est lancé en root). Le fichier /home/xavier0/ssh_for_reverse.log est vide
- lorsque je me connecte en root (sudo su -) puis que je lance /etc/rc.local : tout se passe bien. Le fichier /home/xavier0/ssh_for_reverse.log est vide

Mais lors du démarage de l'ordinateur, la connexion ne peut pas être établie, et le fichier /home/xavier0/ssh_for_reverse.log contient :

ssh: connect to host IP_DE_MON_SERVEUR port 22: Network is unreachable

Est-ce que vous avez une idée d'où peut venir le problème? Ou vous avez une solution alternative à proposer?

Merci d'avance
Sandro

Hors ligne

#2 Le 10/12/2020, à 12:46

noje

Re : reverse SSH (via sshpass) : échoue lorsque lancé depuis rc.local

Ce n’est pas simplement que le réseau ne serait pas opérationnel au moment où il tente d'établir la connexion (juste une hypothèse).
Est-ce que tu as essayé d'ajouter un sleep supérieur à 2 minutes pour voir si ce n'est pas ça  ?

Après il est aussi possible que dans la séquence d’exécution le réseau se lance chronologiquement après le lancement de la connexion ssh automatisé du rc.local.

Pour t'en rendre compte tu pourrais aussi mettre un « ping ubuntu-fr.org >/home/xavier0/testping.txt (voir s’il y a un retour en ms ou une erreur également).

Trouve bizarre que tu lances un script rc.local qui va se lancer donc en root appel SU pour lancer ssh avec l'utilisateur xavier0.
Après c'est peut-être liée à ton robot qui répond à xavier0, je ne sais pas si c'est nécessaire pour toi (car juste lancer la connexion en root serait bien aussi).

Dernière modification par noje (Le 10/12/2020, à 12:51)


- LTS 18.04 & 22.04 - jwm - cwm - zsh

Les seules vraies erreurs sont celles que nous commettons à répétition.
Les autres sont des occasions d'apprentissage. (Dalaï Lama)

Hors ligne

#3 Le 12/12/2020, à 19:06

Sandro11

Re : reverse SSH (via sshpass) : échoue lorsque lancé depuis rc.local

Bonsoir,
merci beaucoup pour ces suggestions :
pour le sleep, en effet, j'avais supposé que 2 minutes suffisent largement, mais en vrai, j'en sais rien. Je vais essayer avec une durée beaucoup plus longue pour voir

Je vais aussi testé le ping.


Pour l'appel avec su, je ne suis plus sur : je sais que le script launch_reverse_ssh.sh se lance sans problème en tant qu'utilisateur (xavier0), mais je ne sais plus s'il se lançait aussi depuis root ou pas (je pense que si j'ai ajouté le su c'est que ça marchait pas, mais possible que je l'ai aussi juste fait "au cas où" sachant que c'est nécessaire pour d'autres commandes lancées depui rc.local). Je vais faire un test sans pour confirmer.


Je teste tout ça lundi au travail (ou mardi si les tests prévus pour lundi s'éternisent).
Merci beaucoup
Sandro

Hors ligne

#4 Le 12/12/2020, à 19:34

Watael

Re : reverse SSH (via sshpass) : échoue lorsque lancé depuis rc.local

2 minutes suffisent largement, mais en vrai, j'en sais rien

alors, c'est une mauvaise solution.

plutôt qu'un ping, utilise

limitSc=10; until nc -z "$serveur" 22 || ((nbSc++ >= limitSc)); do :; done; ((nbSc => limitSc)) && exit 1

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 13/12/2020, à 18:08

LeoMajor

Re : reverse SSH (via sshpass) : échoue lorsque lancé depuis rc.local

bonjour,

nc -i 1 -w 1 -z forum.ubuntu-fr.org 80; [ $? -eq 0 ] &&  echo "service accessible" || echo "service inaccessible"

La plupart du temps, 1 à 2 secondes suffisent, y compris ssh, smtp, imap, ...

service systemd plutôt que rc.local ...

Hors ligne

#6 Le 13/12/2020, à 18:42

Watael

Re : reverse SSH (via sshpass) : échoue lorsque lancé depuis rc.local

directement :

nc ... && echo ok || echo KO >&2

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne