有很多类似标题的问题。我相信在问这个问题之前我已经检查了所有这些。
我的错误su: Permission denied
是用户切换未完成。以下是详细信息。
ssh admin@remote-machine
su --login myuser
Password:
su: Permission denied
(the password is correct)
结果:切换用户失败
然而,以下命令确实有效,尽管它报告了一个小错误:
su --preserve-environment myuser
Password:
bash: /home/admin/.bashrc: Permission denied
结果:切换用户成功
另外,su myuser
没有任何参数的普通也可以。这些变体也有效:
su -P myuser
su -s /bin/sh myuser
尽管我有解决方法,但我想了解这个问题。另外,我最喜欢的命令形式su - user
是不起作用的。此问题仅影响一台远程设备,尽管我有几台远程设备的配置似乎相同。他们都运行 Arch Linux。
我没有使用 SELinux。通过阅读其他问题,我检查了一些事情。
user@remote-machine [/home/myuser] # ls
total 13904
drwx--x---+ 1 myuser myuser 3210 Feb 18 16:00 .
-rw-r--r-- 1 myuser myuser 396 Aug 13 2018 .bashrc
# getfacl /home/myuser/
getfacl: Removing leading '/' from absolute path names
# file: home/myuser/
# owner: myuser
# group: myuser
user::rwx
user:sddm:--x
group::---
mask::--x
other::---
# ls /home/admin/.bashrc
-rw-r--r-- 1 admin admin 624 Apr 17 17:08 /home/admin/.bashrc
less /etc/passwd
myuser:x:1000:1000:myuser myuser:/home/myuser:/bin/bash
以下/etc/pam.d/su
行被注释掉(这是默认的):
# auth required pam_wheel.so use_uid
编辑: 按要求添加信息。
首先,我对该系统和不存在此问题的类似系统进行了diff -rw
比较。没有差异。两者都仅包含./etc/profile.d/
su -l
/etc/profile.d/
/etc/profile
与现有的 Arch Linux 文件相比,其本身有一项更改。但这种变化既存在于正常工作的系统中,也存在于有问题的系统中su -l
。唯一的变化/etc/profile
是umask 006
.
/etc/bash.bashrc
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
[[ $DISPLAY ]] && shopt -s checkwinsize
HISTFILESIZE=
HISTSIZE=
HISTCONTROL=ignorespace
case ${TERM} in
xterm*|rxvt*|Eterm|aterm|kterm|gnome*)
PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
;;
screen*)
PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
;;
esac
[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
下面显示的文件位于我发出su
命令的用户帐户中。但此问题会影响任何用户更改为任何其他用户。我没有看到任何修改过文件的用户帐户(对于 ~/.bash_profile、~/.bash_login 和 ~/.profile)。.bash_login
任何帐户或 中都没有/etc
。
接下来的两个文件都是简单的。
〜/ .bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
~/.bashrc
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
在一个帐户中,~/.bashrc
有:
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
- 所有的别名
.bash_aliases
看起来都不错。该问题还会影响未定义别名的用户。 /etc/security/limits.conf
- 没有行(除了注释之外,工作设备和非工作设备都具有相同的空文件)/etc/securetty
- 原生 Arch Linux(不更改文件且工作和非工作设备具有相同的行)/etc/passwd
- 644 烫发/etc/
- 755 烫发
解决方案:(/etc/pam.d/su-l
但不是其中的任何其他文件/etc/pam.d/
)所需的pam_wheel.so use_uid
。有关更多信息,请参阅已接受的答案。现在这个问题已经解决了,这个问题包含了这个问题的全面清单。希望它能为其他人提供一个很好的参考。
答案1
我怀疑当您生成登录 shell 时调用的脚本之一存在问题,而不是由非登录 shell 调用的脚本。
看一下 INVOCATION 部分man bash
我的内容是:
当 bash 作为交互式登录 shell 或带有 --login 选项的非交互式 shell 被调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的文件中读取并执行命令。
...
当启动非登录 shell 的交互式 shell 时,bash 会从 ~/.bashrc 读取并执行命令(如果该文件存在)。这可以通过使用 --norc 选项来禁止。 --rcfile 文件选项将强制 bash 从文件而不是 ~/.bashrc 读取并执行命令。
对于“小错误” bash: /home/admin/.bashrc: Permission denied
。
这是因为 admin 用户的 HOME 环境变量即将被访问,而 myuser 用户没有访问 HOME 环境变量的权限$~/.bashrc
,而这正是 bash 在生成新 shell 时所做的事情。
答案2
我在这个系统和一个没有这个问题的类似系统之间进行了diff -rw
测试。我发现有这条线/etc/pam.d/
su -l
/etc/pam.d/su-l
未注释的:
auth required pam_wheel.so use_uid
通常会对其进行注释,以免强加此要求。中的其他类似文件都没有/etc/pam.d/
取消注释此行,因此该命令的不同变体的行为不一致。
我通过评论该行解决了这个问题:
# auth required pam_wheel.so use_uid