为root用户采购bash配置文件


17

提前道歉,如果我想知道这个问题会惹恼所有人,那么以前已经以多种方式提出了这个问题。请放心,我已经阅读了档案,并尝试了至少一些建议,但仍然无法解决(简单)问题。希望有人能提供答案,我会感到谦虚。仅供参考,为避免歧义,我将使用绝对路径而不是相对路径。

登录时,我以user身份登录adam。中的别名/Users/adam/.bash_profile已加载,我可以在上拉终端后立即使用它们。我不使用.bashrc文件,这很好。

我不时地通过输入su终端然后输入密码来切换到root 用户。提示更改,我现在是root用户。我的问题是:成为root之后,是否可以立即加载我的root bash配置文件而无需手动获取配置文件?我知道它不会自动发生的原因是因为我的根配置文件和我的别名相同/Users/adam/.bash_profile。成为root用户后,除非我输入,否则source [root_profile_file]它们将不起作用。我尝试设置以下排列,然后通过终端切换到根目录,但是它们都不自动提供配置文件/别名(请注意,我没有同时设置以下任何选项,所以我认为我不会m使系统混乱):

选项1:将我的别名放入/etc/profile

选项2:

  • 在中/etc/profile,插入[ -r /etc/bashrc ] && . /etc/bashrc
  • 把我的别名 /etc/bashrc

选项3:

  • 在中/etc/bash_profile,插入[ -r /etc/bashrc ] && . /etc/bashrc
  • 把我的别名 /etc/bashrc

选项4: 将我的别名放入/var/root/.profile

选项5:

  • 在中/var/root/.profile,插入[ -r /var/root/.bashrc ] && . /var/root/.bashrc
  • 把我的别名 /var/root/.bashrc

选项6:

  • 在中/var/root/.bash_profile,插入[ -r /var/root/.bashrc ] && . /var/root/.bashrc
  • 把我的别名 /var/root/.bashrc

请注意,使用上述任何一种方法,如果我切换到root然后键入source root_profile_file别名,则仅在确实确实手动获取文件的情况下才加载别名。也许我完全误解了bash的工作原理,并且切换到root后无法自动获取配置文件,但我希望有一个简单的解决方案。在此先感谢您抽出宝贵时间阅读此邮件。

Answers:


14

您遇到的问题是,当您自己运行时su,您没有进入“登录” shell。这意味着您的环境,工作目录以及除uid / gid之外的所有内容都与原始用户相同。

登录触发器不执行,并且您遇到描述的问题。

一个简单问题的简单解决方案:

su -

su(1)手册页:

所述命令用于成为登录会话期间的另一用户。在没有用户名的情况下调用su会默认成为超级用户。可选参数-可用于提供类似于用户直接登录后所期望的环境。

也:

   -, -l, --login
       Provide an environment similar to what the user would expect had the user logged in directly.

如果您su进入登录shell,bash会按预期运行,并自动在“ login”上提供适当的文件,而无需过多的解决方法。


1
但是,我将再附上Hai Vu的注释:您真的,真的,真的不应该也su不会那样工作root。这样做是sudo为了达到目的,或者您可以以根本不需要root特权的方式工作。
杰森·萨拉兹

谢谢您和@Hai Vu。“ su-”可以解决问题,是的,完全理解,通常应避免扎根。
亚当·戈尔德

1
我已经知道在su命令后添加'-',但仍然没有从源root用户那里获取我的.bash_profile。弗洛里安·比达贝(Florian Bidabe)和帕特里克(patrix)在以下有关将根壳从sh变为bash的回答为我解决了这个问题。
JaredC 2014年

9

其实根本的用途/bin/sh(旧的Bourne shell),.bash_profile.bashrc通过bash的读取。

由于这些文件可能会使用中没有的功能,因此变得棘手sh。即使您source .bashrcsource .bash_profile,您仍然会遇到例如复杂功能的问题。

解决此问题的一种方法是运行

sudo dscl . -change /Users/root UserShell /bin/sh /bin/bash

rootshell 切换到bash


根的/bin/sh使用/var/root/.profile文件。
感谢@Matic

6

当我绝对必须的时候,我sudo bash让我扎根,但是有了JRobert的环境。我的.bashrc包含:

# Prompt: 'jrobert@JRiMac ~' in green (red, if I'm root), '$' in white
if [[ $UID == 0 ]]; then
   export PS1="\[\e[1;31;40m\]\u@\h \W\[\e[0m\]\$ "
else
   export PS1="\[\e[32;40m\]\u@\h \W\[\e[0m\]\$ "
fi

,以RED的方式向我发出刺眼的刺眼,以强调我现在(更)容易受到我自己的伤害[选择一个:粗鲁,愚蠢,食指倾向,不愿接受良好建议,不高兴-不要丢下桨]。


3

我正在使用sudo -i切换到root用户。在这种情况下,将从中读取shell配置/var/root/.profile


1

总的来说,我建议这样做,su因为它很危险,只需搜索一下,您就会知道为什么。关于您的问题,根帐户的工作方式与您的帐户相同:它的源〜/ .bash_profile和/或〜/ .bashrc。我不知道哪一个,但是我的直觉倾向于〜/ .bashrc,所以您可能想尝试在其中放置别名。这是一个建议:

su           # type password to get into root account
vi ~/.bashrc # put your aliases there
exit         # exit your root session
su           # try again to see if your aliases works

0

sudo dscl . -change /Users/root UserShell /bin/sh /bin/bash 仅此有效!我试图将我放在export PS1=...上述所有这些文件中。/ etc / profile,/ etc / bashrc /var/root/.bashrc /var/root/.profile /var/root/.bash_profile。

从所有这些文件/bin/sh外壳中,不会读取信息!(仅限bash)(Mac OS El Capitan)。而且我不得不将shell更改为bash。

"su -"可以。(与此外壳正在读取/var/root/.profile文件)


1
不需要重新确认现有的答案...
nohillside

-1

解决此问题的一种方法是运行以下命令,将root的shell切换为bash:

sudo dscl . -change /Users/root UserShell /bin/sh /bin/bash

此解决方案也解决了我的问题。


-2

如果您只有一个“默认”用户和root用户,则可以放在alias su="su -"“默认”用户的.bash_profile上,您将获得想要的效果。正常工作,没有任何骇人听闻的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.