~/.bashrc 不是源自 ssh“命令”

Let*_*t4U 21 linux ubuntu debian bash bashrc

在最后.bashrc我补充道:

touch /tmp/bash_noninteractive_test
Run Code Online (Sandbox Code Playgroud)

跑步:

/usr/bin/ssh -v -C root@example.com 'ls'
Run Code Online (Sandbox Code Playgroud)

在主机上(之前交互式登录):

% ls -l /tmp/bash_noninteractive_test
ls: cannot access /tmp/bash_noninteractive_test: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我认为~./bashrc总是来自非交互式 shell,比如通过 SSH?我该如何解决这个问题?

受影响的系统:

% lsb_release  -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.5 LTS
Release:    14.04
Codename:   trusty
Run Code Online (Sandbox Code Playgroud)
 % lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.11 (jessie)
Release:    8.11
Codename:   jessie
Run Code Online (Sandbox Code Playgroud)

小智 22

将我的位添加到旧线程以获取信息,因为接受的答案并不是 .bashrc 不被 ssh 命令读取的真正原因。读完这个答案后我得到了提示。bash 手册页中 INVOCATION 部分的倒数第二段指出:

Bash 尝试确定它何时使用连接到网络连接的标准输入运行,例如何时由远程 shell 守护程序(通常是 rshd)或安全 shell 守护程序 sshd 执行。如果 bash 确定它正在以这种方式运行,它会从 ~/.bashrc 和 ~/.bashrc 读取并执行命令(如果这些文件存在并且可读)。如果作为 sh 调用,则不会执行此操作。--norc 选项可用于禁止此行为,而 --rcfile 选项可用于强制读取另一个文件,但 rshd 和 sshd 通常都不会使用这些选项调用 shell 或允许指定它们。

因此,尽管 ssh 命令以非交互式用户身份运行,但 .bashrc 仍会加载。

但是您的操作系统可能会在 .bashrc 顶部添加类似于以下内容(来自 Ubuntu 18.04)的检查,该检查在前几行之后退出 .bashrc 以进行非交互式调用。

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Run Code Online (Sandbox Code Playgroud)

为了防止检查,请打开 .bashrc 并注释这些行,您的 ssh 命令将读取整个 .bashrc,我想这就是您所期望的结果。

  • 这应该是公认的答案!按照这个答案,我将想要通过 SSH 运行的命令放在 ~/.bashrc 的顶部(在 `case $- in` 等之前),然后一切都可以通过 SSH 运行! (2认同)

tel*_*coM 8

来自调用章节man bash

当启动非登录 shell 的交互式 shell 时,bash 会读取并执行来自/etc/bash.bashrc和 的命令~/.bashrc(如果这些文件存在)。这可以通过使用该--norc选项来抑制。file--rcfile选项将强制 bash 从 file 而不是 和 读取并执行/etc/bash.bashrc命令~/.bashrc

例如,当 bash 以非交互方式启动时,要运行 shell 脚本,它会在环境中查找变量BASH_ENV,如果变量出现在环境中,则扩展其值,并使用扩展后的值作为要读取和执行的文件的名称。Bash 的行为就像执行了以下命令:

         if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
Run Code Online (Sandbox Code Playgroud)

但 PATH 变量的值不用于搜索文件名。

因此,除非指向它,否则它~/.bashrc似乎永远不会源自非交互式 shell BASH_ENV

根据您希望实际实现的目标,您可能会考虑在远程主机上启用PermitUserRC和/或PermitUserEnvironmentin /etc/ssh/sshd_config,然后在 中写入所需的环境变量和~/.ssh/environment/或在 中写入所需的命令~/.ssh/rc

注意:如果您计划将 SSH X11 转发与 一起使用~/.ssh/rc,则必须包含一段代码以将 X11 会话显式提供给命令xauth -q -;请参阅手册页 SSHRC 章节中的示例sshd(8)