ssh 用户@IP sh缺少环境变量

ssh 用户@IP sh缺少环境变量

我使用一种方法

ssh 用户@IP sh [runme.sh]

要远程执行脚本,这工作正常。但我遇到了一个问题,那就是在 runme.sh 中,我无法获取 ~/.bashrc 中定义的任何环境变量。如果我在本地启动脚本,一切都会正常,但是如何使用 ssh 命令获取这些环境配置?

一种可行的方法是添加一行

。 ~/.bashrc

一开始就在每个runme.sh中,但是这样一来,我就需要修改客户端上的很多“runme.sh”文件。有更好的主意吗?

答案1

你不应该在 中定义环境变量~/.bashrc,该文件用于交互运行时的 bash 配置(别名、提示符等)。环境变量的位置是~/.profile;当您在文本模式下启动交互式会话时会读取它,并且在许多系统上也会在图形模式下读取它。看这个答案更多细节。

要运行 bash shell 来像往常一样为远程计算机设置环境变量,您可以这样做

ssh user@IP bash --login runme.sh

对于其他 shell,让它们读取您的.profile(也许/etc/profile也):

ssh user@IP '. /etc/profile; . ~/.profile; exec runme.sh'

如果您想通过 ssh 从本地会话复制环境变量,这是可能的,但通常在服务器端禁用。读这个答案更多细节。

答案2

这个怎么样:

ssh user@IP -- '. ~/.bashrc; sh runme.sh'

您可能应该稍微注意sh和之间的区别bash。如果您在 和 中进行了一些奇特的自定义.bashrcsh例如破折号,那么这可能会失败。

答案3

/etc/profile获取on命令怎么样ssh

ssh user@host "source /etc/profile; sh runme.sh"

采用的答案这个问题

答案4

在目标系统上,sh实际上是bash?很可能不是,这是您.bashrc不被自动阅读的潜在原因之一。

跑步bash runme.sh有用吗?如果是这样,那就是你的问题了。

另外,正如有人已经指出的那样,如果您有任何东西可以检测您的 shell 是否在您的 中以交互方式运行.bashrc,则您的变量必须设置在此代码之上。

相关内容