453 votes

.bashrc à la connexion ssh

Lorsque je me connecte à ma boîte ubuntu fonctionnant sous Hardy 8.04, les variables d'environnement dans ma boîte de dialogue .bashrc ne sont pas définis.

Si je fais une source .bashrc les variables sont correctement définies et tout va bien.

Comment se fait-il que .bashrc n'est pas exécuté à la connexion ?

116 votes

Comment diable cela peut-il être "hors sujet" ?

14 votes

Je ne suis pas strict dans ce domaine, mais je pense que cette question doit être traitée sur serverfault.com, superuser.com ou askubuntu.com.

18 votes

@MichaelButler D'accord. Je me demande pourquoi ils ne le déplacent pas au lieu de le fermer...

788voto

Ayman Hourieh Points 39435

.bashrc n'est pas source lorsque vous vous connectez en utilisant SSH. Vous devez le sourcer dans votre .bash_profile comme ça :

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

0 votes

Cela a fonctionné pour moi sur Ubuntu 11.10 LAMP. Merci !

44 votes

Cela devrait fonctionner sur toute distro saine avec Bash, donc tous ces commentaires sont obsolètes :)

1 votes

Ceci n'est pas nécessaire avec le serveur Ubuntu 12.04 LTS, puisque .bashrc est généré par défaut lorsque vous vous connectez en SSH.

103voto

ruseel Points 340

J'ai connu la même situation que Hobhouse. Je voulais utiliser la commande

 ssh myhost.com 'some_command'

et 'some_command' existe dans '/var/some_location'. j'ai donc essayé d'ajouter '/var/quelque_location' dans l'environnement PATH en modifiant '$HOME/.bashrc'.

mais cela n'a pas fonctionné, car le fichier .bashrc par défaut (Ubuntu 10.4 LTS) empêche le sourcing par un code comme celui-ci

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

Donc, si vous voulez changer l'environnement du shell ssh sans login. vous devez ajouter le code au-dessus de cette ligne.

8 votes

Merci, mon pote ! C'est la partie qui ne fonctionnait pas pour moi :)

1 votes

Cool tip dewd. J'ai rencontré ce piège en exécutant des scripts depuis Jenkins. Je me suis connecté via ssh et ça a marché. Jenkins s'est connecté de manière non-interactive et ça a échoué.

1 votes

Je ne comprends pas pourquoi la solution commune consiste à ne même pas définir un nouveau chemin pour les shells non interactifs. Il devrait y avoir un peu plus que l'instruction if, juste pour cette raison. Il semble que seuls les alias et l'initialisation des outils interactifs devraient aller en dessous de cette ligne...

36voto

lhunath Points 27045

Pour une excellente ressource sur la façon dont l'invocation bash fonctionne, quels dotfiles font quoi, et comment vous devriez les utiliser/configurer, lisez ceci :

0 votes

Le passage clé : "lui fait lire /etc/profile puis l'un des .bash_profile ou .bash_login ou .profile."

33voto

Loïc Wolff Points 1216

Si la solution d'Ayman ne fonctionne pas, essayez de nommer votre fichier comme suit .profile au lieu de .bash_profile . Cela a marché pour moi.

2 votes

Génial. J'ai perdu 15 minutes sur ce détail.

1 votes

Je pense que .profile se charge lors de la connexion à l'interface graphique. .bash_profile est pour les connexions au terminal.

0 votes

Cela a également fonctionné pour la connexion SSH à un conteneur docker Debian Jessie (en utilisant un conteneur de données uniquement pour le stockage persistant) - MAIS vous pouvez également vouloir vérifier /etc/passwd pour vérifier que votre shell de connexion est /bin/bash et non /bin/sh -------> /bin/dash

0voto

swaz Points 171

Semblable à @Loïc Wolff , Ajouté ci-dessous dans mon $HOME/.bash_profile Ubuntu 16

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        echo "Executed .bash_profile , calling .bashrc"
        . "$HOME/.bashrc"
    fi
fi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X