fichier dot non fourni lors de l'exécution d'une commande via ssh

11

Lorsque j'exécute mon programme de manière interactive, cela fonctionne bien:

ssh somehost
$ ~/some/path/somescript.py

Lorsque j'exécute mon programme directement sur ssh, cela ne fonctionne pas. La variable PYTHONPATHn'est pas définie, car elle .bashrcn'est pas d'origine.

ssh somehost ~/some/path/somescript.py

Si je cours ssh somehost 'source ~/.bashrc; ~/some/path/somescript.py', ça marche bien.

Mais ce dernier ne fonctionnerait pas pour d'autres personnes, par exemple en utilisant tcsh sans en avoir ~/.bashrcdu tout).

Quelle est la commande pour exécuter une chose via ssh sur un autre hôte qui fonctionne pour tous les shells?

bzdjamboo
la source
1
Répondu ici, stackoverflow.com/questions/820517/bashrc-at-ssh-login , en gros, ssh ne source pas .bashrc, vous devez vous procurer votre .bashrc via .bash_profile ou d'autres options.
EightBitTony
1
@EightBitTony: Non, c'est un problème différent. La question de bzdjamboo concerne une session non interactive.
Gilles 'SO- arrête d'être méchant'
En fait, la dernière réponse dans le lien que j'ai publié semble être précieuse, ssh fait source .bashrc, mais il ne s'exécute pas en raison de la vérification de l'interactivité. J'apprécie cependant que votre réponse couvre toutes les bases.
EightBitTony
3
@EightBitTony: Sur cette question, la réponse acceptée est une bonne solution pour le demandeur, mais les réponses ne racontent pas toute l'histoire. SSH lui-même ne source rien. Si votre shell de connexion est appelé bash en tant que bash, il source .bash_profileou .profilepour une connexion interactive et .bashrcpour une connexion non interactive. Si votre shell de connexion est appelé bash shou ash ou ksh, il génère .profileune connexion interactive et rien pour une connexion non interactive.
Gilles 'SO- arrête d'être méchant'

Réponses:

12

Aucun fichier standard par utilisateur n'est exécuté pour les connexions non interactives. Vous devez soit rendre le programme autonome, afin qu'il puisse trouver ses dépendances sans s'appuyer sur des variables d'environnement non par défaut, soit définir explicitement l'environnement, généralement avec

ssh somehost '. ~/.profile; exec ~/some/path/somescript.py'

Vous ne devez pas définir de variables d'environnement dans .bashrc: ce fichier est destiné aux shells interactifs et est lu dans chaque instance de bash. Les variables d'environnement doivent être définies .profile, ce qui est lu lorsque vous vous connectez. Mis à part le très petit nombre de personnes qui n'utilisent pas un shell de style Bourne comme shell de connexion, .profilecela fonctionne pour tout le monde, qu'elles utilisent bash ou zsh ou csh ou poisson interactivement. Voir aussi Différence entre .bashrc et .bash_profile , Quels fichiers de configuration doivent être utilisés pour configurer les variables d'environnement avec bash? .

Cela étant dit, il existe un moyen de générer un script chaque fois que vous vous connectez via ssh avec une clé particulière. Voir Existe - t-il un moyen de transmettre les informations de configuration du shell lors de la connexion SSH à un hôte? , sh fichiers de démarrage sur ssh .

Gilles 'SO- arrête d'être méchant'
la source
Maintenant, comment puis-je le marquer comme «répondu»? :-)
bzdjamboo
Sur le côté gauche de cette section de réponse, il devrait y avoir des flèches de vote de haut en bas et un compteur de vote. Juste en dessous, il devrait y avoir le contour d'une case à cocher. Vous pouvez cliquer dessus pour activer la fonction d'acceptation de réponse.
Caleb
Merci encore à vous tous, mais apparemment vos réponses n'ont pas résolu mon problème.
bzdjamboo
Voici une formulation un peu plus récente du problème et ma compréhension actuelle de la racine de celui-ci.
bzdjamboo
Il semble que je ne puisse pas ajouter plus de 60 caractères environ ici, je dois donc poser à nouveau ma question séparément. Désolé ab. cette. Encore une fois, celui-ci n'est pas résolu, et creuser beaucoup plus pendant quelques jours n'a pas aidé.
bzdjamboo
0

J'ai eu le même problème, mais pour moi, la solution était différente. Mon utilisateur n'a pas été configuré pour utiliser bash comme shell, il a utilisé zsh comme shell à la place, donc les fichiers dot bash n'ont pas été exécutés lors de la connexion. Ouvrez / etc / passwd avec un éditeur de texte et recherchez votre nom d'utilisateur et le shell qu'il utilise:

root:x:0:0:root:/root:/bin/zsh

Voici à quoi ressemble mon entrée utilisateur. Notez qu'il dit / bin / zsh au lieu de / bin / bash. Pour zsh, le fichier de points correct est ~ / .zprofile. Son contenu sera exécuté à chaque connexion à l'aide de ssh.

Martin Hansen
la source