4 votes

Source .profile et .bashrc sur la connexion ssh sans tty

Comment m'assurer que les sources ssh .profile y .bashrc sur la connexion sans tty ?

J'ai un Mac (10.6.8) que j'utilise pour diverses tâches UNIX comme l'hébergement de dépôts git. J'ai activé la connexion à distance via le volet "Partage" des Préférences Système. Lorsque je ssh dans la machine, bash sources ~/.profile que j'ai mis en place pour fournir mes ~/.bashrc et mettre en place mon MacPorts chemin. Le problème est que lorsque j'exécute ssh sans un tty comme ceci :

ssh myhost echo \$PATH

Ou lancez un git qui utilise essentiellement ssh de la même manière :

git clone ssh://myhost/~/code/myrepo.git

Mon ~/.profile n'a jamais de source, donc mon $PATH la variable est manquante /opt/local (où MacPorts a installé git ). Je suis conscient que :

  • Je peux configurer git sur ma machine locale pour utiliser /opt/local/bin/git-* sur ma machine distante
  • Je n'aurais pas ce problème si je forçais une tty avec ssh -t

Mais je ne veux faire ni l'un ni l'autre. Je veux que ma machine distante source mon ~/.profile indépendamment du fait que je me connecte ou non avec un tty.

Comment faire de ce rêve une réalité ?

Aussi : J'ai vérifié le comportement sur un couple de machines Linux (Debian et Fedora), et les deux systèmes semblent être à la source de la ~/.bashrc lors de la connexion, qu'il s'agisse d'un fichier tty . J'avais l'impression que BSD et Linux utilisaient tous les deux la même technologie. OpenSSH y bash Il semble donc que la différence de comportement puisse provenir de différences dans les éléments suivants /etc les fichiers de configuration ?

7voto

Clayton Stanley Points 180

Voici une méthode pour que bash génère le fichier .bashrc lors de sessions non interactives, afin de ne pas avoir à coder en dur des variables d'environnement à plusieurs endroits :

  1. Définir PermitUserEnvironment à yes sur /etc/sshd_config ( man sshd )
  2. Définir BASH_ENV à ~/.bashrc sur ~/.ssh/environment ( coup d'homme )
  3. Ajoutez cette ligne au début de votre ~/.bashrc dont les sources sont /etc/profile pour les sessions non interactives :

Cela permet de dupliquer l'environnement de connexion interactif pour les connexions non interactives, sans avoir à coder en dur les valeurs d'environnement (par exemple, $PATH) à plusieurs endroits.

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

L'étape 3. n'est nécessaire que si vous avez défini le(s) chemin(s) d'accès aux Macports dans la section /etc/paths comme je le fais. Mais si vous définissez ces chemins (par exemple, /opt/local/bin ) en ~/.bashrc alors je suppose que vous n'avez pas besoin de l'étape 3.

Pour votre situation, vous devriez pouvoir modifier ~/.bashrc à ~/.profile .

J'ai ~/.bash_profile source ~/.bashrc et je n'utilise pas ~/.profile . Avec cette configuration (et les modifications ci-dessus), les variables d'environnement bash (par exemple, $PATH ) devrait être identique pour les sessions interactives de connexion, les sessions interactives sans connexion et les sessions non interactives.

4voto

staffan Points 3299

Bash a des dispositions spéciales dans son code source pour que ~/.bashrc lorsqu'il est invoqué par rshd o sshd . C'est une option de compilation qui, d'après votre expérience, semble ne pas être activée sous OSX.

Si vous vous connectez avec une clé, vous pouvez (ab)utiliser la fonction command= dans l'option ~/.ssh/authorized_keys dossier. Une clé avec un command n'est valable que pour l'exécution de la commande spécifiée ; b authorized_keys s'exécute avec la variable d'environnement SSH_ORIGINAL_COMMAND défini à la commande spécifiée par l'utilisateur (vide pour les sessions interactives). Vous pouvez donc utiliser quelque chose comme ceci dans ~/.ssh/authorized_keys (bien sûr, cela ne s'appliquera pas si vous n'utilisez pas cette clé pour vous authentifier) :

command=". ~/.profile;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$SHELL\"; fi" ssh-rsa …

Notez que j'ai mis des sauts de ligne ci-dessus pour des raisons de lisibilité, mais il faut en fait tout mettre sur une seule ligne.

Comment puis-je définir des variables d'environnement pour un processus rsync distant ? peut avoir d'autres suggestions utiles.

3voto

Nat Points 10871

C'était très ennuyeux. Décommentez cette ligne dans config-top.h et reconstruisez :

/* Définissez ceci si vous voulez que bash essaie de vérifier s'il est exécuté par sshd et source le .bashrc si c'est le cas (comme le comportement de rshd). Ceci vérifie la présence de SSH_CLIENT ou SSH2_CLIENT dans l'environnement initial, qui peut être trompé dans certaines circonstances peu communes. */

définir SSH_SOURCE_BASHRC

Selon les CHANGEMENTS dans la source, ce comportement a été modifié dans bash-2.05a-rc1. mais la page de manuel actuelle revendique toujours le comportement précédent :

   Bash attempts to determine when it is being run with its standard input
   connected  to a a network connection, as if by the remote shell daemon,
   usually rshd, or the secure shell daemon sshd.  If bash  determines  it
   is  being  run  in  this  fashion,  it reads and executes commands from
   ~/.bashrc, if that file exists and is readable.  It will not do this if
   invoked as sh.  The --norc option may be used to inhibit this behavior,
   and the --rcfile option may be used to force another file to  be  read,
   but  rshd  does  not  generally  invoke the shell with those options or
   allow them to be specified.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X