我以 身份登录到我的服务器userA
,该用户有一个bash
shell,一切正常。
然后,为了程序的目的,我必须这样做sudo adduser --system --home=/home/userB --group userB
;从/etc/passwd
和的内容来看,该用户显然没有密码/etc/shadow
:
$ grep userB /etc/passwd
userB:x:Z08:WW9::/home/userB:/bin/false
$ sudo grep userB /etc/shadow
userB:*:16XXX:0:YYYYY:7:::
此外,主目录中没有/home/userB/.profile
,也没有任何文件。/home/userB/.bash*
userB
现在,当我以 身份登录时userA
,我想以 身份运行命令userB
,特别是检查$PATH
所userB
看到的。所以我尝试编辑 via EDITOR=/usr/bin/nano sudo visudo
,并添加任一行userA
:
...
# User privilege specification
root ALL=(ALL:ALL) ALL
#userA ALL=(userB) NOPASSWD: /bin/bash
userA ALL = (userB) NOPASSWD: ALL
...
...然后保存文件,从远程 shell 注销,重新以userA
.然后我尝试运行:
$ sudo -iu userB; echo $?
1
$ sudo -S -u userB -i /bin/bash -l -c 'echo $HOME'; echo $?
1
$ sudo -i -u userB echo \$HOME; echo $?
1
...很明显,没有任何效果 - 并且也没有错误。然后我以为我会执行strace
以下命令之一,实际上我收到了错误:
$ strace sudo -iu userB
...
write(2, "sudo: effective uid is not 0, is"..., 140sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
) = 140
exit_group(1) = ?
+++ exited with 1 +++
但是,nosuid
我猜这个根分区上不是问题:
$ mount | grep '/ '
/dev/sdaX on / type ext4 (rw,errors=remount-ro)
所以现在我真的不知道该怎么办。在这种情况下是否可以userA
运行命令(例如打印$HOME
环境变量)userB
- 如果可以,我怎样才能让它工作?
答案1
sudo 中的选项-i
尝试创建一个登录 shell,该登录 shell 又启动用户选择的 shell。您已将其设置/bin/false
为/etc/passwd
:
$ grep userB /etc/passwd
userB:x:Z08:WW9::/home/userB:/bin/false
尝试运行:
sudo -u userB ls
如果这有效,那么一切都按照您的配置工作。如果您想要一个交互式 shell,请使用-s
它,它不会调用用户的登录 shell。
如果您想要完整的登录 shell,则必须使用以下命令更改用户的 shell
sudo chsh -s /bin/bash userB
答案2
从sudo
联机帮助页:
-i, --login
Run the shell specified by the target user's password data-
base entry as a login shell.
您的 userB 有/bin/false
shell,因此这就是运行的命令。
% /bin/false ; echo $?
1
因此,要解决此问题,您需要将 userB 的 shell 更改为/bin/bash
(或/bin/sh
您喜欢的任何内容)或者不要使用-i
sudo 标志。您需要登录 shell 吗?