ChatGPT解决这个技术问题 Extra ChatGPT

.bashrc 在 ssh 登录

当我 ssh 进入运行 Hardy 8.04 的 ubuntu-box 时,我的 .bashrc 中的环境变量没有设置。

如果我做一个源.bashrc,变量设置正确,一切都很好。

为什么 .bashrc 没有在登录时运行?

这个“离题”到底是怎么回事?
我并不像这样严格,但我猜这属于 serverfault.com、superuser.com 或 askubuntu.com
@MichaelButler 同意。想知道为什么他们不移动它而不是关闭它...
@Luc - 问题只能在创建后 60 天内移动。这个问题直到创建后 3 年半才作为题外话结束。我相信 60 天规则与备份问题数据库的时间或其他事情有关......在备份发生后迁移变得更加困难。
我认为这是一个非常有用的问题。当我不得不通过 ssh 进入机器 A 以 ssh 进入机器 B 时遇到了这个问题(只能通过 A 的本地网络访问)。教我 .bashrc.bash_profile 之间的实际区别!

A
Ayman Hourieh

当您使用 SSH 登录时,.bashrc 不是来源。您需要像这样在 .bash_profile 中获取它:

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

这应该适用于任何带有 Bash 的健全发行版,因此所有这些评论都已过时:)
对于 Ubuntu 12.04 LTS 服务器,这不是必需的,因为默认情况下,当您通过 SSH 登录时会获取 .bashrc
@orokusaki:更正,它是:) 有一个流氓 .bash_profile 文件迫使 .profile 被跳过。
像@LesterPeabody 一样,我的 .bashrc 没有在 Ubuntu 12.04 LTS 服务器上获取,因为流氓 .bash_profile。它是由 RVM 安装创建的。我将 RVM 命令移至 .profile 并删除 .bash_profile。现在一切正常。
fwiw Debian Jessie/8 已经提供了开箱即用的 .bashrc - 但它来自 .profile,而不是 .bash_profile
3
3 revs, 2 users 80%

我也有类似 Hobhouse 的情况。我想使用命令

ssh myhost.com 'some_command'

其中 some_command 存在于 /var/some_location 中。

我试图通过编辑 $HOME/.bashrc/var/some_location 附加到 PATH 环境变量,但这不起作用。因为默认情况下,.bashrc(在 Ubuntu 10.4 LTS 上)由于这段代码而提前退出:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

这意味着如果您想更改 ssh 非登录 shell 的环境,您应该在该行上方添加代码。


凉尖露水。从詹金斯运行脚本时,我遇到了这个陷阱。我已经通过 ssh 登录并且它有效。詹金斯以非交互方式登录,但失败了。
为什么常见的解决方案是甚至不为非交互式 shell 设置新路径,这超出了我的理解。由于这个原因,if 语句上面应该有相当多的内容。似乎只有别名和交互式工具的初始化应该低于该线......
在其他版本的 Ubuntu 上,交互式检查如下所示:bash # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac
谢谢,这为我解决了。希望我在一个小时前看到这个!
来自 man ssh:“如果指定了命令,它将在远程主机而不是登录 shell 上执行。”对于 Fedora Core 29 上的我来说,它在运行命令时既不调用 .bashrc 也不调用 .bash_profile (并且在没有命令的情况下调用它们)。
l
lhunath

有关 bash 调用如何工作、点文件做什么以及应该如何使用/配置它们的优秀资源,请阅读以下内容:

点文件


关键段落:“导致它读取 /etc/profile,然后读取 .bash_profile 或 .bash_login 或 .profile 之一。”
L
Loïc Wolff

如果 ayman 的解决方案不起作用,请尝试将您的文件命名为 .profile 而不是 .bash_profile。这对我有用。


惊人的。我在这个细节上浪费了 15 分钟。
我认为 .profile 在 GUI 登录时加载。 .bash_profile 用于终端登录。
这也适用于 SSH 登录到 Debian Jessie docker 容器(使用仅数据容器进行持久存储) - 但您可能还需要检查 /etc/passwd 以检查您的登录 shell 是 /bin/bash 而不是 /bin/sh -------> /bin/破折号
@RazecLuar .profile 将由 any 登录 shell 执行,无论所述 shell 是否打算生成 GUI。您的评论与问题和这个答案完全矛盾,这清楚地表明 .profile 是在 SSH 中调用的 - 一种明显的非 GUI 方法。
s
swaz

类似于 @Loïc Wolff ,在我的 $HOME/.bash_profile Ubuntu 16 下面添加

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        echo "Executed .bash_profile , calling .bashrc"
        . "$HOME/.bashrc"
    fi
fi