全局 /etc/profile setenv 或导出覆盖 .profile 中的用户设置

全局 /etc/profile setenv 或导出覆盖 .profile 中的用户设置

我需要在CentOS 5.3 集群上调用程序的修改版本/home/user_name/bin而不是(旧)版本。/opt/program_name/current该程序使用 python 创建一个 tcsh 脚本,然后执行该脚本。

我可以覆盖 PATH 以调用 中程序的修改版本~/bin,从而which program_name标识 n 的路径~/bi。我已经在 、 、 和 中完成.bashrc.profile.tcshrc操作.cshrc。但是,每次执行 tcsh 时,/etc/profile都会加载环境变量 from 并将路径恢复为/opt/program_name/current.

/etc/profile.d/program_name.sh这些特定于程序的变量在调用时设置/etc/profile

# /etc/profile 
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done
unset i

因此,当program_name.sh调用时,对应的脚本为:

# /etc/profile.d/program_name.sh
setenv PATH ${PATH}:/opt/program_name/current

如何防止/etc/profile我的用户帐户被访问?

我没有 su 访问权限,并且其他用户仍在使用旧版本的软件,/opt/program_name/current因此我无法更新软件或修改设置/etc/profile.d/program_name.sh

答案1

tcsh 不会自发读取/etc/profile,脚本中一定有某些内容导致了这种情况。一种可能的可能性(但不是唯一的可能性)是脚本以 开头#!/bin/tcsh -l,因此 tcsh 充当登录 shell。这仍然不会导致它读取/etc/profile,但它会导致它读取/etc/csh.login,这可能会读取其他文件(我不知道 CentOS 附带什么,csh.login也不知道您的系统管理员如何定制它)。

读取后/etc/csh.login,tcsh 读取~/.login。根据它的配置方式,它可能会在~/.login之前、之后或代替~/.tcshrc.所以一定PATH要尝试覆盖~/.tcshrc

如果这不起作用,修改 Python 脚本可能是您最好的选择。如果代码位于模块中,您可以通过放置一个包装器模块来解决它,该模块会PYTHONPATH加载原始代码并进行一些更改。

如果失败,则没有简单的方法可以“重定向”程序可执行文件或 tcsh 的访问。原则上,通过使用包装一些文件访问函数是可能的LD_PRELOAD(如果涉及的所有程序都是动态链接的并且没有设置[ug]id),但工作量很大。

很可能有一种更简单的方法,可以通过挂钩到脚本的某个地方,例如,使用.cshrc.如果没有看到那个脚本,很难说得更准确。

答案2

你最好的选择可能是不依赖PATH而是给出 的完整路径program_name

至于为什么它要获取 /etc/profile,它必须由/etc/csh.chsrc或 可能调用/etc/csh.login。有关更多信息,请参阅man的页面tcsh。具体来说,查找(搜索)以下部分Startup and shutdownFILES在手册页中。

启动和关闭,这是最相关的部分:

登录 shell 首先执行系统文件 /etc/csh.cshrc/etc/csh.login/ 中的命令。然后它从用户主目录中的文件执行命令

...

非登录 shell 只读/etc/csh.cshrc或 启动时~/.tcshrc读取。~/.cshrc

并从文件(涵盖所有 *nix 风格):

   /etc/csh.cshrc  Read first by every shell.  ConvexOS, Stellix and Intel
                   use /etc/cshrc and  NeXTs  use  /etc/cshrc.std.   A/UX,
                   AMIX,  Cray  and IRIX have no equivalent in csh(1), but
                   read this file in tcsh anyway.  Solaris  2.x  does  not
                   have it either, but tcsh reads /etc/.cshrc.  (+)
   /etc/csh.login  Read  by  login shells after /etc/csh.cshrc.  ConvexOS,
                   Stellix   and   Intel   use   /etc/login,   NeXTs   use
                   /etc/login.std,  Solaris 2.x uses /etc/.login and A/UX,
                   AMIX, Cray and IRIX use /etc/cshrc.

相关内容