我添加了一个新组:ircuser
和一个新用户:ircuser
我在其中visudo
放置了这一行:
myuser localhost=(ircuser) NOPASSWD: /usr/bin/irssi
创建的ircuser
目录,其中应保存配置文件、缓存等:
drwxrwx--- 2 ircuser ircuser 4096 Mar 2 10:28 ircuser
发出命令时:
sudo -Hu ircuser /usr/bin/irssi
或者
sudo -u ircuser /usr/bin/irssi
程序无法将配置文件保存在ircuser
目录中。
** ERROR **: Couldn't create /home/myuser/_web/ircuser/.irssi directory
aborting...
Aborted
但是,它的运行方式为ircuser
:
ps auxw | grep irssi
ircuser 11962 0.0 0.0 23684 2504 pts/6 S+ 11:18 0:00 /usr/bin/irssi
那么,尽管它irssi
运行,但ircuser
它无法写入同一用户拥有的目录?我需要更改什么才能让它保存在那里?
答案1
问题可能在于通向 ircuser 主目录的父目录之一没有 eXecute 权限。为了让任何用户能够遍历(不一定要查看目录),该用户必须通过组或其他组具有执行权限。如果您拥有这些权限:
drwxrwx--- 2 myuser myuser 4096 Mar 2 10:28 /home/myuser
并且 ircuser 不属于 myuser 组,那么 ircuser 即使具有该目录的权限也无法访问其下的任何文件。如果你尝试这样做:
drwxrwx--x 2 myuser myuser 4096 Mar 2 10:28 /home/myuser
然后 ircuser 无法浏览 myuser 的主目录,但它可以访问其下面的某些文件,例如/home/myuser/_web/ircuser
更新:我在上面的描述中遗漏了一些细节。当您遍历文件系统时会评估权限。可以从当前目录开始访问从根目录开始无法访问的文件夹。如果将工作目录更改到其他位置,您将失去当前目录的句柄并失去对其中文件的访问权限。如果您使用 sudo su - ircuser 之类的命令,su 将在放弃 root 权限之前切换到 ircuser 的主目录。此时,您就拥有了 ircuser 主目录的有效句柄,因为它是当前工作目录。如果启动 irssi,它将作为 ircuser 在 ircuser 的主目录中运行。如果您尝试访问 .irssi,这将起作用,因为您对当前目录具有 eXecute 权限。如果您必须遍历缺少 eXecute 权限的目录,iy 将失败。例如,打开文件/home/myuser/_web/ircuser/.irssi
甚至从当前目录开始并使用相对路径,../../_web/ircuser/.irssi
因为它需要遍历/home/myuser
您没有 eXecute 权限的地方。
答案2
使用-H
使执行命令时sudo
将“home”视为用户主目录的选项。您可以在 sudo 的手册页上找到更详细的解释:http://linux.die.net/man/8/sudo
答案3
您介意尝试使用 sudo -iu ircuser /usr/bin/irssi 吗?
此外,正如 Patkos Csaba 已经指出的那样,检查 sudoers 中设置的 env_reset、env_keep 默认值。
来自 sudoers 联机帮助页:
As a special case, if sudo's -i option (initial login) is specified,
sudoers will initialize the environment regardless of the value of
env_reset. The DISPLAY, PATH and TERM variables remain unchanged;
HOME, MAIL, SHELL, USER, and LOGNAME are set based on the target user.
On Linux and AIX systems the contents of /etc/environment are also
included. All other environment variables are removed.
因此 sudo -i 将初始化环境以绕过这些值。
编辑:我已经在 Ubuntu 盒子上重现了你的设置,甚至 sudo -u ircuser /usr/bin/irssi 对我来说也很好用。
来自我的 /etc/sudoers
<snipped>
Defaults env_reset, log_output
<snipped>
testing LABUBU01=(ircuser) NOPASSWD: /usr/bin/irssi
版本:
testing@LABUBU01:~$ sudo -V
Sudo version 1.8.3p1
pmplugin policy_plugin 5.6.0 (034)
pmplugin io_plugin 5.6.0 (034)
testing@LABUBU01:~$ uname -a
Linux LABUBU01 2.6.35-28-generic #50-Ubuntu SMP Fri Mar 18 19:00:26 UTC 2011 i686 GNU/Linux
testing@LABUBU01:~$ ls -lap /home/
total 64
drwxr-xr-x 16 root root 4096 2012-03-02 15:57 ./
drwxr-xr-x 22 root root 4096 2011-12-08 15:48 ../
drwxr-xr-x 3 ircuser ircuser 4096 2012-03-02 15:57 ircuser/
/编辑
编辑2:
你的错误:
** 错误 **:无法创建 /home/myuser/_web/ircuser/.irssi 目录正在中止...已中止
状态,它无法创建位于您的主目录中的 /home/myuser/_web/ircuser/.irssi ,而不是位于 ircuser 的主目录中。 /编辑2