总体问题是,当我登录时,我的提示符按照 /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 bash
,sudo
请将用户名切换为,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
时自动设置主目录以匹配新身份myuser
sudo
- 或添加
Defaults always_set_home
到 sudoers 文件以强制sudo
系统上的所有命令执行此行为。 (某些 Linux 发行版默认启用此功能。)
如果您在切换用户时并不特别想切换主目录,那么您需要确保新用户可以读取您的个人 shell 启动文件。
您需要允许sudo -u newuser bash
运行的最低权限/home/myuser/.bashrc
是:
- 搜索权限
/home/myuser
- 读取权限
/home/myuser/.bashrc
如果没有方便的用户组对 和 都是通用的myuser
,newuser
并且 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::---