~ / .profile n'est pas chargé lors de l'utilisation de SSH (Ubuntu)

22

Modifié pour refléter le problème que je voulais vraiment résoudre:

Je dois configurer mon environnement Ruby pour pouvoir déployer via Capistrano.

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

Je les mets dans ~ deploy / .profile, mais quand je ssh dedans, ils ne sont pas exécutés. Des idées?

J'utilise Ubuntu 12.04.


La question initiale était:

Quand je ssh dans un autre compte chez localhost, il ne charge pas mon .profile. Comment puis-je forcer ssh à le charger? J'utilise Ubuntu 12.04.

Charles R
la source

Réponses:

15

Vous pouvez spécifier explicitement que vous souhaitez démarrer un shell de connexion interactif:

 ssh user@host bash --login -i 

Le "rôle" de ~/.profile(ou ~. / Bash_profile) et .bashrcpour ssh ont d'autres fichiers, (voir man sshpour plus de détails):

~ / .ssh / environnement

Contient des définitions supplémentaires pour les variables d'environnement; voir ENVIRONNEMENT, ci-dessus.

~ / .ssh / rc

Les commandes de ce fichier sont exécutées par ssh lorsque l'utilisateur se connecte, juste avant le lancement du shell (ou de la commande) de l'utilisateur. Voir la page de manuel sshd (8) pour plus d'informations.


la source
«Vous pouvez» n'est souvent pas vrai, car ssh est exécuté par un autre outil (livraison continue) et la commande ne peut pas être facilement modifiée.
Jan Hudec
6

.profilen'est chargé que pour les shells de connexion, ce qui n'est pas le cas d'une session ssh (par défaut). Si vous voulez que quelque chose s'exécute au démarrage pour tous les shells interactifs, placez-le à la .bashrcplace ( .zshrcou ce que votre shell utilise).

De plus, si vous voulez simplement vous connecter à un autre compte sur la machine locale, ssh est probablement exagéré. Vous voudrez peut-être utiliser suou quelque chose à la place.

qmega
la source
3
Il semble qu'il .bashrcne soit pas chargé non plus.
kenorb
Ceci est une erreur. Il s'agit d' un shell de connexion. Depuis la page de manuel: "Si la commande est spécifiée, elle est exécutée sur l'hôte distant au lieu d'un shell de connexion."
mkj
~ / .zshenv fonctionne pour moi. unix.stackexchange.com/questions/4921/sh-startup-files-over-ssh
user91155
Lorsque ssh reçoit une commande à exécuter, par défaut, il n'alloue pas de terminal et le shell n'est pas non plus «interactif».
Jan Hudec
4

L'utilisation de bash devrait entraîner la lecture ~/.bashrc. Ce qui suit peut aider avec ksh et sh (bash en mode sh), ou lorsque votre ~/.bashrcn'est pas exécuté lors de la connexion.

Le sshd consulte ~/.ssh/environment(vérifiez sshd_config (5) pour les autorisations) et ~/.ssh/sshrcou ~/.ssh/rc. Cela donne la possibilité de configurer ENV=~/.profileou BASH_ENV=~/.profileetSSH_LOGIN=Y

Dans ~/.profileJ'ai la mise en page suivante (Remplacer ENVpar BASH_ENVlors de l'utilisation de bash):


if [[ -n $SSH_LOGIN || -z $ENV ]]; then
     # Put here login initialization code
     unset SSH_LOGIN
     ENV=~/.profile
fi
 # Put here code thats get executed with each ksh/sh invocation

eremmel
la source
0

Bash ~/.profilene lit que lorsqu'il s'agit d'un shell de connexion et ~/.bash.bashrcuniquement s'il possède un terminal, aucun des deux n'est vrai par défaut lors de l'appel d'une commande avec ssh. Cependant, il existe plusieurs autres options pour définir l'environnement, sur le serveur, toutes malheureusement en fonction de la configuration du système:

  • Zsh lit ~/.zshenvmême dans ce cas; il n'y a cependant pas de fichier de configuration correspondant pour bash.
  • Si l' PermitUserEnvironmentoption est activée dans /etc/sshd_configssh, ssh lira ~/.ssh/environment. Malheureusement, cette option est désactivée par défaut.
  • Si le pam_env.soest appelé avec user_readenv=1in /etc/pam.d/sshd, il lira ~/.pam_environment. Bien qu'il ne soit pas par défaut du module, il est appelé ainsi au moins dans Ubuntu .
  • Si tout le reste échoue, vous pouvez mettre une command=directive dans le fichier de clés autorisées appelant un script wrapper qui définit l'environnement et exécute le $SSH_ORIGINAL_COMMANDà la fin (I la commande est une pour shell, donc eval est approprié ici, mais je ne suis pas sûr) .
Jan Hudec
la source
0

Vous en avez probablement un ~/.bash_profilequi l'emporte ~/.profile.

user541686
la source