Bonjour,

Je suis en train de revoir un de mes scripts écrit en bash.
Dans ce script, j'établis un tunnel SSH avec le serveur distant. Ce tunnel fait un lien (bind) entre le port local 3336 et le port distant 3306. J'utilise ensuite ce tunnel pour transmettre une commande mysql.

Le problème rencontré est que la commande mysql met à jour la base de données de la machine locale et non celle du serveur distant.

Voici le modèle de montage du tunnel :
sshpass -p"$decryptedssh_pass" \
        ssh -v -o 'ControlMaster=no,ControlPath=no' \
            -$IP_version \
            -N -L $tunnel_listening_port:$localhost:$db_listening_port \
            -p $ssh_port \
            "$ssh_login@$remote_server" &
Et le modèle de la commande mysql :
sshpass -p"$decryptedssh_pass" \
        mysql -u "$db_login" -p$decrypteddb_pass --port "$tunnel_listening_port" -h "$localhost" -D "$db_name" \
                -e "$SQLqueries;"
Pourriez-vous me dire pourquoi le code mysql s'exécute dans la base de données locale au lieu d'être redirigé vers le serveur distant au travers du tunnel ?
Bonjour

c'est sur quelle Fedora?

Pourquoi sshpass pour la commande mysql?
C'est sur une Fedora 30 (mais le problème est-il vraiment lié à la version de Fedora ?).
La commande sshpass permet de passer le mot de passe à la commande ssh pour monter le tunnel.
Ah mais je viens de voir que je l'ai utilisée aussi pour la commande mysql. Quoique ça ne change rien car je viens de réessayer avec la commande mysql directement et j'ai le même problème.
Du coup après avoir enlever le sshpass, si tu ajoute l'option --verbose à la commande mysql tu auras peut être une piste.
Tu pourrais aussi faire un lsof -i :$tunnel_listening_port juste avant la connexion mysql pour voir si le port est bien en écoute.
Si tu teste à la main, hors script, ça passe ?

ps: je déplace le sujet dans la bonne section du coup
Si je tape en direct dans le shell la commande :
$ sshpass -p"$decryptedssh_pass" ssh "$ssh_login@$remote_server" -L $tunnel_listening_port:$localhost:$db_listening_port -N -p $ssh_port
J'obtiens l'erreur :
$ bind [::1]:3336: Cannot assign requested address
on dirait une variable vide, non initialisée. Tu les as bien toutes initialisées avant ?

Ce qui serait bien aussi c'est de sécuriser tes variables:
sshpass -p"$decryptedssh_pass" ssh "$ssh_login@$remote_server" -L $tunnel_listening_port:$localhost:$db_listening_port -N -p $ssh_port
deviendrait
sshpass -p"${decryptedssh_pass}" ssh "${ssh_login}@${remote_server}" -L ${tunnel_listening_port}:${localhost}:${db_listening_port} -N -p ${ssh_port}
J'ai pu le monter en rajoutant l'IP v4 (j'en ai profité pour protéger les variables aussi) mais la mise à jour se fait toujours sur la bdd locale et non la distante.
J'ai essayé avec et sans l'option
-o 'ControlMaster=no,ControlPath=no'
Bon, en fait il fallait simplement déclarer l'option SSH en plusieurs fois :
-o 'ControlMaster=no' -o 'ControlPath=no'
Et mettre une pause avant de lancer la commande mysql pour que le ssh ait le temps de monter le tunnel ; ça donne donc :
# Establishing a SSH tunnel
sshpass -p"${decryptedssh_pass}" \
        ssh -f -N -L "${tunnel_listening_port}":"${localhost}":"${db_listening_port}" \
            -p "${ssh_port}" \
            -${IP_version} \
            "${ssh_login}"@"${remote_server}" \
            -o 'ControlMaster=no' -o 'ControlPath=no' &

sleep 3

# Connecting and querying to the database
mysql -v -v -v \
        --protocol=TCP --host="${localhost}" --port="${tunnel_listening_port}" \
        -u "${db_login}" -p${decrypteddb_pass} \
        -D "${db_name}" \
        -e "${SQLqueries}"