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,我想这就是您所期望的结果。
来自调用章节man bash:
当启动非登录 shell 的交互式 shell 时,bash 会读取并执行来自
/etc/bash.bashrc和 的命令~/.bashrc(如果这些文件存在)。这可以通过使用该--norc选项来抑制。file--rcfile选项将强制 bash 从 file 而不是 和 读取并执行/etc/bash.bashrc命令~/.bashrc。例如,当 bash 以非交互方式启动时,要运行 shell 脚本,它会在环境中查找变量
BASH_ENV,如果变量出现在环境中,则扩展其值,并使用扩展后的值作为要读取和执行的文件的名称。Bash 的行为就像执行了以下命令:Run Code Online (Sandbox Code Playgroud)if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi但 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)。
| 归档时间: |
|
| 查看次数: |
24051 次 |
| 最近记录: |