.bashrc à la connexion ssh


375

Lorsque je ssh dans mon ubuntu-box exécutant Hardy 8.04, les variables d'environnement dans mon .bashrcne sont pas définies.

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

Comment se .bashrcfait-il qu'il ne soit pas exécuté à la connexion?


92
Comment diable est ce "hors sujet"?
Jonah

8
Je ne suis pas strict comme ça, mais je suppose que cela appartient à serverfault.com, superuser.com ou askubuntu.com
Michael Butler

16
@MichaelButler a accepté. Je me demande pourquoi ils ne le déplacent pas au lieu de simplement le fermer ...
Luc

4
@Luc - Les questions ne peuvent être déplacées que dans les 60 jours suivant leur création. Cette question n'a été classée hors sujet que 3 ans et demi après sa création. Je crois que la règle des 60 jours a quelque chose à voir avec la sauvegarde des bases de données de questions ou quelque chose ... il devient plus difficile de migrer après cette sauvegarde.
ArtOfWarfare du

Je pensais que c'était une question assez utile. J'ai rencontré ce problème lorsque j'ai dû ssh dans la machine A, afin de ssh dans la machine B (accessible uniquement via le réseau local de A). M'a appris une différence pratique entre .bashrcet .bash_profile!
information_interchange

Réponses:


621

.bashrcn'est pas fourni lorsque vous vous connectez à l'aide de SSH. Vous devez le trouver dans votre .bash_profilecomme ceci:

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

32
cela devrait fonctionner sur n'importe quelle distribution saine avec Bash, donc tous ces commentaires sont obsolètes :)

1
Ce n'est pas nécessaire avec le serveur Ubuntu 12.04 LTS, car il .bashrcprovient de votre connexion SSH, par défaut.
orokusaki

4
@orokusaki: Correction, c'est :) Il y avait un fichier escroc .bash_profile qui forçait .profile à être ignoré.
Lester Peabody

4
Comme @LesterPeabody, mon .bashrc ne provenait pas d'un serveur Ubuntu 12.04 LTS en raison d'un .bash_profile escroc. Il a été créé par l'installation RVM. J'ai déplacé la commande RVM vers .profile et supprimé .bash_profile. Tout va bien maintenant.
Rod Daunoravicius

4
fwiw Debian Jessie / 8 fournit déjà des sources prêtes à l'emploi .bashrc- mais il le fait à partir de .profile, non .bash_profile.
underscore_d

76

J'avais une situation similaire comme Hobhouse. Je voulais utiliser la commande

 ssh myhost.com 'some_command'

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

mais cela ne fonctionnait pas. parce que .bashrc par défaut (Ubuntu 10.4 LTS) empêche le sourcing par code comme ci-dessous

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

donc si vous voulez changer l'environnement pour le shell non-login ssh. vous devez ajouter du code au-dessus de cette ligne.


7
Merci mon pote! C'était le morceau qui n'a pas fonctionné pour moi :)
Raymond Barlow

Pointe fraîche rosée. J'ai rencontré ce piège lors de l'exécution de scripts à partir de Jenkins. Je me suis connecté via ssh et cela a fonctionné. Jenkins s'est connecté de manière non interactive et il a échoué.
Krzysztof Jabłoński

1
Pourquoi la solution commune est de ne même pas définir un nouveau chemin pour les shells non interactifs me dépasse. Il devrait y avoir un peu au-dessus de cette déclaration if, juste pour cette raison. Il semble que seuls les alias et l'initialisation des outils interactifs devraient descendre en dessous de cette ligne ...
BenPen

2
Sur une autre version d'Ubuntu, la vérification interactive ressemble à:bash # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac
Sylvain

Merci, cela l'a résolu pour moi. J'aimerais avoir vu ça il y a environ une heure!
Justin Lawrence

31

Pour une excellente ressource sur le fonctionnement de l'invocation bash, ce que font les fichiers dot et comment les utiliser / configurer, lisez ceci:


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

29

Si la solution d'Ayman ne fonctionne pas, essayez de nommer votre fichier .profileau lieu de .bash_profile. Cela a fonctionné pour moi.


2
Impressionnant. J'ai perdu 15 minutes sur ce détail.
vmassuchetto

Cela a fait l'affaire sur Ubuntu 12.10
ThinkCode

1
je pense que .profile se charge sur la connexion GUI. .bash_profile son pour les connexions de terminal.
Razec Luar

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 vérifier / etc / passwd pour vérifier que votre shell de connexion est / bin / bash & not / bin / sh -------> / bin / dash
Stuart Cardall

1
@RazecLuar .profiledoit être exécuté par n'importe quel shell de connexion, que celui-ci ait l'intention de générer une interface graphique ou non. Votre commentaire contredit totalement la question et cette réponse, qui indiquent clairement que cela .profileest invoqué sur SSHing dans - une méthode nettement non GUI.
underscore_d
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.