如何在交互式非登录 shell 上获取正确的启动脚本

如何在交互式非登录 shell 上获取正确的启动脚本

我正在尝试在准系统 OpenSolaris 衍生版本(OmniOS,Illumos/OpenIndiana 的发行版)中设置一个健全/可用的环境。我在 .profile、.inputrc 和 .bashrc 文件中准备好了所需的所有管道代码,可以在系统范围内使用,但没有为非登录 shell 提供系统范围的脚本。 Bash 尝试在 su 上加载用户的 .bashrc 文件,但 $HOME(以及任何其他环境变量)仍保留为先前用户配置。

直接 (SSH) 登录的输出:

login as: myuser
Using keyboard-interactive authentication.
Password:
/etc/profile run
myuser's .bashrc run
myuser's .profile run
myuser@Helios:~$ echo ~
/home/myuser
myuser@Helios:~$

输出切换用户:

root@Helios:/etc# su myuser
bash: /root/.bashrc: Permission denied
bash-4.2$ id
uid=1001(myuser) gid=100(users) groups=100(users),27(sudo)
bash-4.2$ echo ~
/root
bash-4.2$

请特别注意尝试获取 root 的 .bashrc 而不是 myuser 的 .bashrc。

su(没有额外的参数)在 Ubuntu、Fedora 等中始终无缝工作,我打算复制这种体验,但是当没有系统范围的脚本运行并且无法找到用户的脚本时我该怎么办?我倾向于责怪 OmniOS 版本的 bash 和/或 su 遗漏了某些内容,但正确的行为到底是什么?我可以在某处配置/访问/编写额外的管道来解决更新 $HOME 和其他环境变量的失败问题吗?

进一步说明:

  • OmniOS 中没有 man bash (至少不使用 MANPATH=/opt/omni/share/man:/opt/mysql55/man:/opt/gcc-4.4.4/man:/usr/gnu/share/man: /usr/local/man:/usr/local/share/man:/usr/man:/usr/share/man)
  • /etc/bashrc 和 /etc/bash.bashrc 永远不会获取来源(这是预期的,因为这显然是特定于发行版的约定,但 Ubuntu 似乎确实在不引用 .bashrc 的情况下加载这些文件)

答案1

su命令不会更改HOMESolaris 下的环境变量。这就是它的工作原理。在Linux和*BSD下,su确实重置HOME,我认为这是BSD/SysV的区别。 Bash 的行为完全正常:它尝试加载~/.bashrc,并且由于HOME仍然是/root,所以是/root/.bashrc

这个想法是,当您su获得 root 权限时,您启动的 shell 和其他程序仍然会在您的主目录中查找您的配置文件。如果您想要目标用户的环境,您可以运行su -.

如果您想要设置HOME但又保持环境不变,请显式设置。

HOME=~myuser su myuser

bash 是否加载系统范围的文件是一个编译时选项。该选项在 Ubuntu 上启用,但在 OmniOS 上禁用。

答案2

您的应用程序能够利用 SMF 吗?如果是这样,为应用程序设置服务可能会更容易。

我见过一个 Python 脚本,可以非常轻松地生成供 SMF 使用的 XML:
歧管

相关内容