Bonjour,
Pour exécuter des requêtes SQL sur un serveur distant, je fais actuellement ceci en partant de mon PC perso :
$ ssh user@server1
user@server[database]/home/user$ psql
psql (9.4.4)
Type "help" for help.
database=# select tablename from pg_tables LIMIT 1;
tablename
--------------
pg_statistic
(1 row)
database=#
J'aimerais, toujours depuis mon PC perso, lancer cette requête SQL, et obtenir sur la sortie standard de mon PC perso, le résultat de cette requête.
Sur un serveur sans pgbouncer :
$ ssh user@server1 psql << "END"
select tablename from pg_tables LIMIT 1;
END
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Sur un serveur avec pgbouncer :
$ ssh user@server2 psql << "END"
select tablename from pg_tables LIMIT 1;
END
psql: ERROR: No such database: user
J'ai fais des recherches qui m'ont orienté vers la redirection de ports mais je ne parviens à rien :
$ ssh -L 63333:localhost:5433 user@server
user@server[database] /home/user $
Je suis aussitôt connecté comme si j'avais fait ssh user@server
. Je ne sais que faire ensuite, ça ne m'avance à rien…
SmallFitz$ ssh -N -f -L 5433:localhost:5433 user@server
SmallFitz$ psql
psql: FATAL: le rôle « SmallFitz » n'existe pas
Là je ne sais pas vraiment ce que ça fait, en tout cas mon prompt est libre mais je ne sais quoi faire ensuite…
Pourriez vous me venir en aide, me remettre sur les rails ?
Merci. :)
# inverse
Posté par Sytoka Modon (site web personnel) . Évalué à 4. Dernière modification le 31 août 2016 à 20:57.
Et voilou !
[^] # Re: inverse
Posté par benja . Évalué à 2. Dernière modification le 31 août 2016 à 22:03.
Pourrais-tu être plus explicite ? À priori il ne devrais y avoir aucune différence de comportement entre les deux versions.
Je suppose que le problème pourrait être du à une différence entre le mode batch et interactif de ssh: peut-être un alias shell ou une variable d'environnement non passée…? Vu que la table ne s'appelle pas user, ben je dirais qu'une solution serait de demander à psql de connecter à la bonne base (option -d iirc, à vérifier).
Note: une autre solution serait de configurer postgres pour écouter sur le réseau en TLS et configurer l'authentification de manière adéquate…
[^] # Re: inverse
Posté par benja . Évalué à 1.
s/table/db/
[^] # Re: inverse
Posté par Sytoka Modon (site web personnel) . Évalué à 3. Dernière modification le 01 septembre 2016 à 22:13.
C'est peut être un bogue du bash mais la solution avec cat marche mais pas l'autre… Une autre soluce consiste à mettre des guillemets (pas testé ici) qui en gros donne une chaîne multi-lignes. On voit alors que le <<END est fait sur le serveur distant et non local.
[^] # Re: inverse
Posté par NeoX . Évalué à 2.
parce que ta commande :
equivaut à lancer la commande :
sur le serveur final, ce qui n'est pas une commande valide
d'apres la documentation la bonne commande serait celle-ci (note le \x obligatoire)
evidemment il faut aussi preciser la base de données, et d'autres options si necessaire
plus d'infos ici
https://www.postgresql.org/docs/9.4/static/app-psql.html
[^] # Re: inverse
Posté par benja . Évalué à 1. Dernière modification le 02 septembre 2016 à 00:22.
Le \x n'a rien d'obligatoire: la documentation précise simplement que la seule façon de mélanger des méta-commandes (celles qui influencent le comportement du client, par exemple \x pour activer un formatage étendu) et des requêtes sql c'est de piper dans psql. Par opposition à utiliser l'argument -c; par exemple
psql -d madb -c "select xxx;"
. L'argument à -c ne permet que l'utilisation de commandes sql. Dans le cas, si l'on désire modifier le comportement de psql, il faut soit configurer le fichier .psqlrc ou activer d'autres options de la ligne de commande (p.e. -x sur la ligne de commande est équivalent à \x dans psql).[^] # Re: inverse
Posté par NeoX . Évalué à 3.
sauf que la documentation dit clairement que les fichiers psqlrc et .psqlrc sont ignorés quand on utilise l'option -c
[^] # Re: inverse
Posté par SmallFItz . Évalué à 1.
Oui quoi qu'il arrive des fichiers de conf ne sont pas lu.
[^] # Re: inverse
Posté par SmallFItz . Évalué à 1.
Cette commande est valide chez moi :
[^] # Re: inverse
Posté par benja . Évalué à 1.
Es-tu l'auteur de l'entrée de ce forum ? J'ai vraiment du mal à croire que
cat <<EOT | ssh cmd
fonctionne différemment quessh cmd <<EOT
![^] # Re: inverse
Posté par Sytoka Modon (site web personnel) . Évalué à 2.
J'ai déjà lancé pas mal de jeux de commande à distance via ssh et la commande cat marche mais pas << ! Pourquoi ? Je ne sais pas du tout… Normalement, le << est géré par le shell donc ne devrait pas être transmis à la commande distante comme un post le dis ci-dessus.
[^] # Re: inverse
Posté par Sytoka Modon (site web personnel) . Évalué à 2. Dernière modification le 05 septembre 2016 à 16:18.
En fait, je viens de tester, cela marche aussi… Je suis sur qu'il y a quelques années, cela ne marchait pas d'ou la forme avec cat que j'avais mis au point. Ceci dis, la seconde forme semble préférable et ne pose pas de problème de tty…
[^] # Re: inverse
Posté par SmallFItz . Évalué à 1.
Salut,
Bonne piste ! Merci ! :) Je vais me renseigner sur la conf qui se trouve sur le serveur.
Voir s'il y a un alias ou quelque chose qui permet de ne donner aucun prédicat à la commande psql.
[^] # Re: inverse
Posté par SmallFItz . Évalué à 1.
Bingo ça venait bien de là.
Mise en place de deux variables de test pour mettre en évidence l'importance des quotes simples sur les quotes double après la commande ssh.
En local :
Sur le serveur :
Maintenant test des DOUBLES quote
Maintenant je teste les SIMPLE quote
Conclusion : Il faut utiliser les simple quote.
Maintenant recherche de la conf utilisée.
Y'a donc bien un souci de definition de la variable $PGPORT.
Une rapide recherche m'a permis de trouver que cette variable était définie dans le .bash_profile
Il est donc nécessaire de le lire, de le sourcer avec . .bash_profile;
Ca marche !
Confirmé par :
Merci à tous ! =)
[^] # Re: inverse
Posté par SmallFItz . Évalué à 1. Dernière modification le 05 septembre 2016 à 17:21.
Maintenant l'incompréhension c'est pourquoi le .bash_profile n'est pas lu ???
J'ai essayé un
Le bash a vraiment l'air de s'exécuter sur le server… Et ma sortie standart à l'air redirigée là bas, alors que mon entrée standard non (je crois ???)
[^] # Re: inverse
Posté par NeoX . Évalué à 2.
parce que .bash_profile est lu quand le bash est en mode 'interactif'
ce qui n'est pas le cas quand tu fais un
ssh user@server 'commande'
[^] # Re: inverse
Posté par SmallFItz . Évalué à 1.
Salut,
Ca ne change rien j'ai la même erreur :
# comprendre le tunnel ssh, ca aide
Posté par NeoX . Évalué à 5.
ben oui, tu as demandé à créer un tunnel 63333 depuis ta machine vers le localhost:5433 en passant par server
c'est ce que tu as, il faut laisser ce terminal ouvert, pour maintenir le tunnel.
maintenant il faut utiliser ce tunnel (qui soit dit en passant n'a pas de sens si tu as deja acces au port normal (5433) sur l'IP du serveur.
pour utiliser ce nouveau port sur ta machine locale, il faut dire à psql de se connecter à localhost (ta machine), port 63333 (celui sur lequel est monté le tunnel)
et ca ira vers le server, au travers SSH, a localhost (le server), port 5433 (celui de postgresql)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.