我使用一种方法
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
。如果您在 和 中进行了一些奇特的自定义.bashrc
,sh
例如破折号,那么这可能会失败。
答案3
答案4
在目标系统上,sh
实际上是bash
?很可能不是,这是您.bashrc
不被自动阅读的潜在原因之一。
跑步bash runme.sh
有用吗?如果是这样,那就是你的问题了。
另外,正如有人已经指出的那样,如果您有任何东西可以检测您的 shell 是否在您的 中以交互方式运行.bashrc
,则您的变量必须设置在此代码之上。