通过ssh运行命令时未获取点文件


11

当我交互式运行程序时,它可以正常运行:

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

当我直接通过ssh运行程序时,它不起作用。该变量PYTHONPATH未设置,因为.bashrc它不是源变量。

ssh somehost ~/some/path/somescript.py

如果我运行ssh somehost 'source ~/.bashrc; ~/some/path/somescript.py',它将正常运行。

但是后者不适用于其他一些人,例如,使用tcsh却根本不使用a ~/.bashrc)。

通过ssh在适用于所有shell的另一台主机上运行事物命令是什么?


1
在这里回答,stackoverflow.com/ questions/820517/bashrc-at-ssh- login,基本上,ssh不会源.bashrc,您需要通过.bash_profile或其他选项来源.bashrc。
EightBitTony

1
@EightBitTony:不,那是另一个问题。bzdjamboo的问题是关于一个非交互式会话。
吉尔(Gilles)“所以,别再邪恶了”,

实际上,我发布的链接中的最后一个答案似乎很有价值,ssh确实提供了.bashrc的源代码,但由于检查了交互性,因此它未执行。但是,我感谢您的回答涵盖了所有基础。
SevenBitTony11年

3
@EightBitTony:在这个问题上,被接受的答案对于提问者来说是一个很好的解决方案,但是答案并不能说明全部。SSH本身不提供任何资源。如果您的登录shell被bash调用为bash,则作为源.bash_profile.profile用于交互式登录,以及.bashrc用于非交互式登录。如果您的登录Shell是bash as sh或ash或ksh 调用,则它将.profile为交互式登录提供资源,而为非交互式登录提供任何资源。
吉尔(Gilles)“所以,别再作恶了”,

Answers:


12

没有针对非交互式登录运行的标准每用户文件。您需要使程序自包含,以使其能够在不依赖非默认环境变量的情况下找到其依赖项,或者显式设置环境,通常使用

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

您不应该在中设置环境变量.bashrc:该文件用于交互式shell,并且在bash的每个实例中读取。应该在中设置环境变量.profile,该变量将在您登录时读取。除了极少数不使用Bourne风格的shell作为其登录shell的人之外,.profile它确实适用于所有人,无论他们使用bash还是zsh或csh或以交互方式钓鱼。另请参见 .bashrc和.bash_profile之间的区别应该使用哪个安装文件来设置bash的环境变量?

话虽如此,每当您使用特定密钥通过ssh登录时,就有一种方法可以生成脚本。请参阅在SSH到主机时是否有办法推送shell配置信息?sh通过ssh启动文件


现在如何将其标记为“已回答”?:-)
bzdjamboo 2011年

在此答案部分的左侧,应该有上下投票箭头和投票计数器。在其正下方应有一个复选框的轮廓。您可以单击以激活答案接受功能。
Caleb

再次感谢大家,但是显然您的回答并不能解决我的问题。
bzdjamboo 2011年

这是问题的新形式,也是我目前对问题根源的理解。
bzdjamboo 2011年

似乎我不能在此处添加超过60个左右的字符,因此我不得不再次单独询问我的问题。对不起,ab。那。再说一次,这个问题还没有解决,而且继续挖掘几天没有帮助。
bzdjamboo 2011年

0

我有同样的问题,但是对我来说解决方案是不同的。我的用户未配置为使用bash作为外壳,而是使用zsh作为外壳,因此bash点文件未在登录时运行。使用文本编辑器打开/ etc / passwd,然后查找您的用户名及其使用的shell:

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

这是我的用户条目的外观。请注意,它说的是/ bin / zsh而不是/ bin / bash。对于zsh,正确的点文件是〜/ .zprofile。每次您使用ssh登录时,其内容都将运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.