Comment faire pour exécuter une commande SQL dans un script Bash et enregistrer la sortie de cette commande à une variable

Je cherche à joindre certains composants Oracle dans un script Bash qui va effectuer une série d'objectifs:

  1. Connecter à un serveur distant (d'où mon Oracle DB réside) en tant que root.
  2. Effectue un "su - oracle".
  3. Journaux dans sqlplus environnement comme un Oracle de l'utilisateur.
  4. Exécute une commande SQL select et stocke le résultat de cette commande dans une variable.
  5. Affiche le résultat de cette variable dans le shell Bash.

J'ai regardé à travers quelques exemples ici sur stackoverflow, dont beaucoup semblent aller plus de l'exécution d'une commande, mais pas nécessairement détaillant comment faire pour afficher le résultat à l'utilisateur (même si je suis encore en examinant d'un peu plus). Par exemple, en supposant que tous les échanges de clé de l'installation à l'avance, une méthode pourrait consister à utiliser les éléments suivants:

#!/bin/sh
ssh -q root@5.6.7.8
sqlplus ABC/XYZ@core <<ENDOFSQL
select CREATE_DATE from PREPAID_SUBSCRIBER where MSISDN='12345678912';
exit;
ENDOFSQL

Au lieu de cela, voici comment j'ai essayé de le configurer:

#!/bin/sh
datasource_name=`echo "select CREATE_DATE from PREPAID_SUBSCRIBER where MSISDN='12345678912';" | ssh -q 5.6.7.8 "su - oracle -c 'sqlplus -S ABC/XYZ@core'" | tail -2 | head -1`

Idéalement, le datasource_name variable doit maintenant prendre les valeurs:

no rows selected

Ou si il y a une entrée dans le tableau:

CREATE_DATE
-------------------
07-06-2009 18:04:48

La queue et la tête commandes sont à se débarrasser des lignes vides dans la sortie, et le ssh -q et sqlplus -S sont les options pour ignorer les avertissements.

Cependant, lorsque je lance la commande, et de faire une:

echo "${datasource_name}"

- Je obtenir...

Avertissement: pas d'accès à l'ats (Mauvais descripteur de fichier).
Donc pas de contrôle sur leur travail dans cette coquille.

...à la place de l'une des deux sorties ci-dessus. Si je comprends bien, ce est un avertissement qui peuvent être causés en fonction de la nature spécifique shell est utilisé, mais la plupart des sources indiquent que cela peut être ignoré. La bonne chose à propos de cet avertissement, c'est qu'il semble que ma commande ci-dessus est effectivement en cours d'exécution et de stockage "quelque chose" dans datasource_name, mais il n'est tout simplement pas ce que je veux.

Maintenant pour simplifier ce problème, j'ai remarqué que je reçois le même ats avertissement lorsque j'essaie simplement de la ligue d'oracle sur l'ordinateur distant à partir de la case où le script bash s'exécute:

ssh root@5.6.7.8 "su - oracle"
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.

Si je fais le suivant, je reçois effectivement dans le sqlplus environnement avec succès sans problèmes:

ssh -q root@5.6.7.8 "su - oracle -c 'sqlplus ABC/XYZ@core'"

SQL*Plus: Communiqué de 9.2.0.4.0 - Production le Mar 29 Mai-12:35:06 2012

Copyright (c) 1982, 2002, Oracle Corporation. Tous droits réservés.

Connecté à des bases de données Oracle 10g Enterprise Edition Version
10.2.0.4.0 - 64bit de Production Avec le Partitionnement, Real Application Clusters, OLAP, Data Mining et Real Application Testing options

SQL>

Si je comprends pourquoi le problème ci-dessus se produit, il est possible que je puisse comprendre comment obtenir mon script fonctionne correctement. Toutes les suggestions sont grandement appréciés! Je vous remercie.

  • Pourquoi avez-vous ssh en tant que root (!) de l'utilisateur, la ligue de l'oracle utilisateurs? Pourquoi ne pas utiliser le protocole ssh en tant qu'utilisateur oracle?
InformationsquelleAutor Arun Reddy | 2012-05-29