当我以交互方式运行程序时,它工作正常:
ssh somehost
$ ~/some/path/somescript.py
当我直接通过 ssh 运行我的程序时,它不起作用。该变量PYTHONPATH
未设置,因为.bashrc
没有来源。
ssh somehost ~/some/path/somescript.py
如果我跑步ssh somehost 'source ~/.bashrc; ~/some/path/somescript.py'
,效果很好。
但后者对其他一些人不起作用,例如使用 tcsh 而~/.bashrc
根本没有 tcsh)。
什么是这命令通过 ssh 在另一台适用于所有 shell 的主机上运行某个东西?
答案1
没有针对非交互式登录运行的标准每用户文件。您需要使程序独立,以便它能够在不依赖非默认环境变量的情况下找到其依赖项,或者显式设置环境,通常使用
ssh somehost '. ~/.profile; exec ~/some/path/somescript.py'
您不应该在 中设置环境变量.bashrc
:该文件适用于交互式 shell,并在每个 bash 实例中读取。环境变量应该在 中设置.profile
,当你登录时会读取它。除了极少数不使用 Bourne 风格的 shell 作为登录 shell 的人之外,它对.profile
每个人都适用,无论他们使用 bash 还是 zsh 或者交互地使用 csh 或 Fish。也可以看看
.bashrc 和 .bash_profile 之间的区别,
应该使用哪些设置文件来使用 bash 设置环境变量?。
话虽这么说,有一种方法可以在您每次使用特定密钥通过 ssh 登录时获取脚本。看有没有办法在 SSH 连接到主机时推送 shell 配置信息?,通过 ssh 的 sh 启动文件。
答案2
我遇到了同样的问题,但对我来说解决方案不同。我的用户未配置为使用 bash 作为 shell,而是使用 zsh 作为 shell,因此 bash 点文件在登录时不会运行。使用文本编辑器打开 /etc/passwd 并查找您的用户名及其使用的 shell:
root:x:0:0:root:/root:/bin/zsh
这就是我的用户条目的样子。请注意,它显示的是 /bin/zsh 而不是 /bin/bash。对于 zsh,正确的点文件是 ~/.zprofile。每次您使用 ssh 登录时都会运行其内容。