从历史上看,配置文件(/etc/profile
和~/.profile
)是在您登录时(在文本控制台上,还有其他功能)被调用的,并具有多种用途:
- 设置会话的环境变量和其他参数(例如umask)。
- 在会话开始时运行其他程序(例如,电子邮件通知)。
- 如果会话不同于外壳程序(例如另一个外壳程序或X Window),请运行该会话的程序。
- 设置终端参数(例如
stty
)。
- 设置外壳参数(例如别名)。
直到后来,所有这些目的才被确定为单独的。因为配置文件脚本可能会执行仅在交互式会话(终端交互,启动其他程序)中有意义的事情,所以在引入远程Shell调用(rsh)时,rsh的品牌决定不将远程Shell作为登录Shell进行调用,这样就不会执行配置文件脚本。(某些版本的rshd
可以选择将远程外壳作为登录外壳运行。)Ssh复制了此行为,以代替rsh。
如果要执行配置文件脚本,则可以显式调用它们。
ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'
请注意将.
配置文件脚本加载到Shell中的命令:它们是要在该Shell中执行的命令,而不是外部程序。
如果要为所有用户全局设置环境变量,许多系统上还有另一种方法:而不是在中定义它,而在/etc/profile
中定义它/etc/environment
。该文件通过pam_env
模块读取;大多数Linux发行版都可以读取它。
如果您的登录外壳是bash,则还有另一种可能性。通常,您不应在其中设置环境变量.bashrc
(因为除非在带有交互式外壳的终端中使用,否则将不会在X会话中设置环境变量,因为如果您在文本控制台上或以交互方式登录,则不会设置环境变量) ssh,因为如果您在另一个程序中调用Shell,它们将覆盖自定义设置)。但是,bash具有一个我从未了解的奇怪功能:它~/.bashrc
在两种不相关的情况下读取:
- 在不是登录外壳的交互式外壳中;
- 在不是登录shell的非交互式shell中,如果bash认为它已由
rshd
或调用sshd
。
在ssh上运行命令时,您处于第二种情况。您可以通过阅读/etc/profile
和.profile
从中安排阅读个人资料.bashrc
。在您的中包含以下代码~/.bashrc
:
case $- in
*i*) :;; # this is an interactive shell, fine
*) # This is not an interactive shell! This must be a non-interactive remote shell session.
. /etc/profile; . ~/.profile
return;;
esac
ydisplay
工作吗?做ssh 127.0.0.1 /usr/app/cpn/bin/ydisplay
工作?