Aller au contenu

Environnement d'éxécution de session ssh non interactive

Table of contents

Positionnement du problème

Lors de l'éxécution d'une commande sur un site distant par ssh l'environnement n'est pas positionné par l'éxécution du .bashrc

On le constate en comparant le résultats produit par l'éxécution de la commande env dans les deux contextes interactif vs non-interactif.

cas de l'éxécution non interactive

ssh postgres@vmpgdeb2 env SHELL=/bin/bash XDG_SESSION_COOKIE=d1972cda01f5a935fdc4e1a10000027f-1396515845.558540-1345276070 SSH_CLIENT=192.168.56.11 40585 22 USER=postgres MAIL=/var/mail/postgres PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games PWD=/home/postgres LANG=en_US.UTF-8 SHLVL=1 HOME=/home/postgres LANGUAGE=en_US:en LOGNAME=postgres SSH_CONNECTION=192.168.56.11 40585 192.168.56.12 22 _=/usr/bin/env

cas de l'exécution interactive

Connexion

ssh postgres@vmpgdeb2 Linux vmpgdeb2 2.6.32-5-amd64 #1 SMP Mon Feb 25 00:26:11 UTC 2013 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Thu Apr 3 11:05:49 2014 from vmpgdeb1

commande

postgres@vmpgdeb2:/home/postgres/ [dummy] env PGDB=dummy TERM=xterm SHELL=/bin/bash XDG_SESSION_COOKIE=d1972cda01f5a935fdc4e1a10000027f-1396516683.800437-2094283887 SSH_CLIENT=192.168.56.11 40588 22 SSH_TTY=/dev/pts/2 USER=postgres PGPORT=54320 LD_LIBRARY_PATH=/u00/app/oracle/instantclient LS_COLORS=rs=0:d........ PGUSER=postgres PGSQLPATH=/u00/app/pg/local/dmkpg/sql:/u00/app/pg/admin/dummy/sql PGDATABASE=postgres PGBASE=/u00/app/pg MAIL=/var/mail/postgres PATH=/u00/app/pg/product/9.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games PWD=/home/postgres PGLOCALEDIR=/u00/app/pg/product/9.1/share/locale LANG=en_US.UTF-8 PGADM=/u00/app/pg/admin/dummy PS1=${LOGNAME}@${HOSTNAME}:${PWD}/ [${DB}] PGHOME=/u00/app/pg/product/9.1 SHLVL=1 HOME=/home/postgres LANGUAGE=en_US:en DMKPGHOME=/u00/app/pg/local/dmkpg LOGNAME=postgres SSH_CONNECTION=192.168.56.11 40588 192.168.56.12 22 PGDATA=/u01/pg/data/null ORACLE_HOME=/u00/app/oracle/instantclient _=/usr/bin/env postgres@vmpgdeb2:/home/postgres/ [dummy]

Problème

Le script .bashrc exécuter lors de la connexion vérifie que la session est interactive.

# If not running interactively, don't do anything [ -z "$PS1" ] && return

Cela oblige à positionner manuellement dans tous les scripts utilisés de cette manière votre environnement d'éxécution.

Solution

Elle est décrite dans ces deux liens ci-dessous. source-profile....on ssh login sans tty setting environnemnt on remote on interactive ssh...

Résumé des actions possibles.

Solution 1

  • Positionner coté serveur ssh
    • la paramètre PermitUserEnvironment à yes dans sshd_conf
    • redémarrer lde serveur ssh - service ssh restart
    • Positionner dans ~/.ssh/environment la variable BASH_ENV
    • ou comme

      dans notre cas DMKPGHOME=/u00/app/pg/local/dmkpg

Attention le positionnement de BASH_ENV entraine l'éxécution du contenu de BAS_ENV à chaque appel de bash.

Résultat

barman@vmpgdeb1:~/source$ ssh postgres@vmpgdeb2 env SHELL=/bin/bash XDG_SESSION_COOKIE=d1972cda01f5a935fdc4e1a10000027f-1396520509.980640-683673841 SSH_CLIENT=192.168.56.11 40593 22 USER=postgres MAIL=/var/mail/postgres PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games PWD=/home/postgres LANG=en_US.UTF-8 SHLVL=1 HOME=/home/postgres LANGUAGE=en_US:en DMKPGHOME=/u00/app/pg/local/dmkpg LOGNAME=postgres SSH_CONNECTION=192.168.56.11 40593 192.168.56.12 22 _=/usr/bin/env

Solution 2

  • Modifier .bashrc en ajoutant le code suivant:

    if [[ ! $- == i ]]; then . ~/profile fi

  • Ajouter dans votre fichier profile l'environnement utile. > # dmkpg init # ~/.DMKPGHOME #t if [ -f ~/.DMKPGHOME ]; then . ~/.DMKPGHOME . $DMKPGHOME/bin/dmkpg.bash dummy fi il est pas prudent d'appeller dmkpg.bash dans ce script il y a de nombreux effet de bord possible (psql)

Résultat

ssh postgres@vmpgdeb2 env PGDB=dummy SHELL=/bin/bash XDG_SESSION_COOKIE=d1972cda01f5a935fdc4e1a10000027f-1396519672.367280-1795997669 SSH_CLIENT=192.168.56.11 40592 22 USER=postgres LS_COLORS= PGPORT=54320 LD_LIBRARY_PATH=/u00/app/oracle/instantclient PGUSER=postgres PGSQLPATH=/u00/app/pg/local/dmkpg/sql:/u00/app/pg/admin/dummy/sql PGDATABASE=postgres PGBASE=/u00/app/pg MAIL=/var/mail/postgres PATH=/u00/app/pg/product/9.1/bin:/u00/app/pg/product/9.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games PWD=/home/postgres PGLOCALEDIR=/u00/app/pg/product/9.1/share/locale LANG=en_US.UTF-8 PGADM=/u00/app/pg/admin/dummy PS1=${LOGNAME}@${HOSTNAME}:${PWD}/ [${DB}] PGHOME=/u00/app/pg/product/9.1 SHLVL=1 HOME=/home/postgres LANGUAGE=en_US:en DMKPGHOME=/u00/app/pg/local/dmkpg LOGNAME=postgres SSH_CONNECTION=192.168.56.11 40592 192.168.56.12 22 PGDATA=/u01/pg/data/null ORACLE_HOME=/u00/app/oracle/instantclient _=/usr/bin/env barman@vmpgdeb1:~/source$

Conclusion

La solution 1 évite la gestion de multiple fichier de gestion de l'environnement. La solution 2 dans notre cas n'èvite pas le besoin de lancer un environnement spécifique

Mon choix :

La solution 1 , le script status ci-dessous donnant le résultat attendu.

script

#!/bin/bash . \$DMKPGHOME/bin/dmkpg.bash \$DMKPGHOME/bin/sta.bash exit

résultat

ssh postgres@vmpgdeb2 bash -c '"~/status.bash appone"'

---------------------------------------------------------------
appone   |  server is running 
---------------------------------------------------------------
psql (PostgreSQL) 9.3.3
---------------------------------------------------------------
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
(3 rows)
---------------------------------------------------------------

Written with StackEdit.