通过ssh运行命令也运行.bashrc?

通过ssh运行命令也运行.bashrc?

问题描述:

在我阅读bash manpage时,只应在shell以交互方式运行时执行.bashrc。手册页定义了交互为:通过ssh运行命令也运行.bashrc?

一种交互式shell启动一个没有非选项参数 和不带-c选项,其标准输入和错误都 连接到端子(由isatty(3)确定) ,或者使用-i选项启动 。 PS1被设置,$ - 包括我如果bash是 交互式,允许shell脚本或启动文件来测试这个 状态。

但是,使用ssh执行命令也会导致运行.bashrc,与我所期望的相反,因为该命令不是交互式运行的。所以,这种行为看起来像一个错误,但它似乎也广泛应用于我试过的所有Red Hat和bash版本。有人能解释为什么这种行为是正确的吗?

还有一点:即使运行.bashrc,$-$PS被设置为好像shell是非交互式的(就像我期望的那样)。

$ grep USER /etc/passwd 
USER:x:UID:GID:UNAME:/home/USER:/bin/bash 

$ cat ~/.bashrc 
echo bashrc:$-,$PS1 

$ bash -c 'echo $-' 
hBc 

$ ssh localhost 'echo $-' </dev/null 2>/dev/null 
[email protected]'s password: 
bashrc:hBc, 
hBc 

$ ssh localhost 'ps -ef | grep $$' </dev/null 2>/dev/null 
[email protected]'s password: 
bashrc:hBc, 
USER 28296 28295 0 10:04 ? 00:00:00 bash -c ps -ef | grep $$ 
USER 28297 28296 0 10:04 ? 00:00:00 ps -ef 
USER 28298 28296 0 10:04 ? 00:00:00 grep 28296 

我目前解决此工作由.bashrc中测试[[ $- = *i* ]],但它好像我不应该这样做。

一个例子服务器,包含在我家目录中没有其他文件比的.bashrc(和的.ssh)有此配置:

$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.7 (Tikanga) 

$ bash --version 
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) 
Copyright (C) 2005 Free Software Foundation, Inc. 

的bash的版本,我已经试过这:3.00.15, 3.1.17,3.2.25,4.1.2(后者在Red Hat 6.3上)。

+0

从远程计算机的角度来看,外壳或许是交互式的,即使在本地机器不会让用户交互。你能检查远程shell的命令行参数吗? – 2013-05-14 15:34:27

+0

“.bash_profile”的输出是什么?我只是在寻找像'if [-f〜/ .bashrc];然后 。 〜/ .bashrc fi会在登录时激活'.bashrc'。 – Ewan 2013-05-14 15:35:23

+0

@ kisamoto:'.bash_profile'仅对登录shell运行。 – 2013-05-14 15:36:00

Bash manual

击尝试确定何时它正在与它的连接到网络连接,当由远程外壳守护进程,通常rshd,或安全壳守护程序执行作为标准输入运行sshd。如果Bash确定它以这种方式运行,它将读取并执行来自~/.bashrc的命令,如果该文件存在且可读的话。如果作为sh调用,它不会执行此操作。 --norc选项可用于禁止此行为,而--rcfile选项可用于强制读取其他文件,但rshd通常不会使用这些选项调用shell或允许指定它们。

Debian默认bashrc骨架的解决方法是将在.bashrc顶部以下内容:

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

我现在在手册页中看到了这一点。我对用于交互式shell的.bashrc描述感到困惑:“〜/ .bashrc:单个每个交互式shell启动文件”。 – 2013-05-14 15:57:43