sudo 没有按预期执行 bashrc

sudo 没有按预期执行 bashrc

总体问题是,当我登录时,我的提示符按照 /etc/bashrc 正确显示格式,但是当我使用 bash 向另一个用户执行 sudo 时,提示符会变得很奇怪。

/etc/bashrc 中的基本格式

PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

...和...

prompt_host=`/bin/hostname`

顺序:

我以 myuser 身份登录我的终端。我的提示符格式正确,与上面的 /etc/bashrc 匹配:

[email protected] pwd :

虽然上面暗示我的默认 shell 程序似乎是 bash,但我相信我正在使用 sh:

echo $SHELL     <---not very meaningful but I expect someone will ask me to run this
/bin/sh

ps -p `echo $$`
  PID TTY          TIME CMD
 7105 pts/2    00:00:00 sh     <---which looks to be an interactive shell (no dash)

ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
72338     9321  9320  0 01:07 pts/3    00:00:00 -sh   <---or is it a login shell????

./filethatsnotthere.sh
-sh: ./filethatsnotthere.sh: No such file or directory

最后但并非最不重要...

getent passwd myuser
myuser:x:72338:25000:My Name:/home/myuser:/bin/sh

另外,很明显 /etc/profile 的来源是因为:

echo $prompt_host
the.hostname.fully.qualified

所以看起来像 sh 并且 /etc/profile 正在被获取。但这让我很困惑......

 ls -l `which sh`
lrwxrwxrwx. 1 root root 4 Jan 12  2018 /bin/sh -> bash

...叹...但是即使我们遵循我正在使用 sh 的理论,我也会使用 bash sudo 到 newuser 。 newuser 有一个配置文件设置为 newuser .bash_profile,它来源 newuser .bashrc,后者来源 /etc/bashrc。

但 newuser 的提示无法正常工作,并且显然没有运行任何 newuser 配置文件。它完全丢失了提示中的主机名

sudo -u newuser bash
newuser@ pwd         <---no hostname

我知道没有运行任何新用户配置文件,因为我在其中放入了 echo 语句以确认它们何时运行,并且它们不显示。即便如此,我还是确认 newuser 确实在运行 bash:

ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
newuser  11717 11715  0 03:47 pts/1    00:00:00 bash

ps -p `echo $$`
  PID TTY          TIME CMD
11717 pts/1    00:00:00 bash

./filethatsnotthere.sh
bash: ./filethatsnotthere.sh: No such file or directory

/etc/profile 没有运行(这是有道理的,因为这是一个交互式 shell,而不是登录 shell):

echo $prompt_host
<crickets....>

但是 - newuser 的启动文件也不在 /home/newuser 目录中...所以,如果我使用 sudo 命令对用户使用 bash,为什么没有获取该用户的 bash 配置文件?由于它是一个交互式 shell,即使 /etc/profile 不是直接获取的,我仍然希望运行新用户的文件。

答案1

sudo可以配置设置$HOME切换用户时匹配新用户,或者不匹配。在您的情况下,它似乎被设置为 not switch $HOME。当您想要切换到专用于特定服务应用程序的用户帐户,但仍想继续使用时,这会很有用你的个人 shell 配置和其他设置。

实际上~/.bashrc只是 的简写$HOME/.bashrc

因此,当您这样做时sudo -u newuser bashsudo请将用户名切换为,newuser$HOME仍设置为/home/myuser

bash尝试执行时~/.bashrc,它有一个小问题:as newuser,它可能无权读取,/home/myuser/.bashrc除非您明确授予该访问权限。如果您还没有,这可能就是.bashrc被跳过的原因。因为$HOME仍设置为/home/myuser,所以不会尝试执行/home/newuser/.bashrc

如果你想sudo设置HOME=/home/newuser,你可以:

  • -H将该选项与 sudo 命令一起使用:sudo -Hu newuser bash
  • 或添加Defaults>newuser always_set_home到您的文件中以在切换到仅时sudoers自动设置主目录newuser
  • 或添加到 sudoers 文件以在运行任何命令Defaults:myuser always_set_home时自动设置主目录以匹配新身份myusersudo
  • 或添加Defaults always_set_home到 sudoers 文件以强制sudo系统上的所有命令执行此行为。 (某些 Linux 发行版默认启用此功能。)

如果您在切换用户时并不特别想切换主目录,那么您需要确保新用户可以读取您的个人 shell 启动文件。

您需要允许sudo -u newuser bash运行的最低权限/home/myuser/.bashrc是:

  • 搜索权限/home/myuser
  • 读取权限/home/myuser/.bashrc

如果没有方便的用户组对 和 都是通用的myusernewuser并且 ACL 不可用(即仅传统的 Unix 样式权限),则这将是传统的方法:

chmod 711 /home/myuser          # i.e. directory permissions drwx--x--x
chmod 644 /home/myuser/.bashrc  # i.e. file permissions      -rw-r--r--

如果 ACL 可用于包含您的主目录的文件系统,您可以这样做来授予最低限度的必要访问权限:

setfacl -m u:newuser:x /home/myuser
setfacl -m u:newuser:r /home/myuser/.bashrc

如果主目录的权限最初是drwx------,则在此命令之后,权限/home/myuser将如下所示drwx--x---+。要检查完整的 ACL,请使用getfacl

$ getfacl /home/myuser
getfacl: Removing leading '/' from absolute path names
# file: home/myuser
# owner: myuser
# group: myuser
user::rwx
user:newuser:--x
group::---
mask::--x
other::---

相关内容