可以以 root 身份编辑文件,但不能使用 sudo

Car*_*ala 6 root permissions sudo

我刚刚遇到了一个非常奇怪的情况。

我试图编辑 file /usr/lib/thunderbird/thunderbird.sh,它具有以下权限:

$ ll /usr/lib/thunderbird/thunderbird.sh
-rwxr-xr-x 1 root root 2730 Aug 20 12:55 /usr/lib/thunderbird/thunderbird.sh*
Run Code Online (Sandbox Code Playgroud)

我发现如果我发出

sudo vim /usr/lib/thunderbird/thunderbird.sh
Run Code Online (Sandbox Code Playgroud)

当我切换到插入模式时,我收到一条警告消息:

/usr/lib/thunderbird/thunderbird.sh [RO]
W10: Warning: Changing a readonly file
-- INSERT --
Run Code Online (Sandbox Code Playgroud)

而且我实际上不能写任何更改。

但是,如果我发出:

user@hostname:~$ sudo su -
root@hostname:~# vim /usr/lib/thunderbird/thunderbird.sh
Run Code Online (Sandbox Code Playgroud)

我可以毫无问题地编辑文件。

奇怪的是,我已经编辑很多类似的权限,如在配置文件中的文件/etc/,没有问题,那如果我创建相同的目录中的文件我没有问题编辑它:

user@hostname:~$ sudo touch /usr/lib/thunderbird/test.sh
user@hostname:~$ sudo chmod 755 /usr/lib/thunderbird/test.sh
user@hostname:~$ ll /usr/lib/thunderbird/test.sh /usr/lib/thunderbird/thunderbird.sh
-rwxr-xr-x 1 root root    0 Aug 20 13:03 /usr/lib/thunderbird/test.sh*
-rwxr-xr-x 1 root root 2730 Aug 20 12:55 /usr/lib/thunderbird/thunderbird.sh*
user@hostname:~$ sudo vim /usr/lib/thunderbird/test.sh
Run Code Online (Sandbox Code Playgroud)

这是我的 sudoers 文件:

# Cmnd alias specification
Cmnd_Alias  APT = /usr/bin/apt-get update, /usr/bin/apt-get upgrade

# User privilege specification
root    ALL=(ALL:ALL) ALL 

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL 

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL 
%sudo   ALL=(ALL:ALL) NOPASSWD: APT
Run Code Online (Sandbox Code Playgroud)

我的用户在 sudo 组内。

知道为什么会发生这种情况吗?

Car*_*ala 8

刚刚才发现原因,是各种情况的集合:

首先,我不知道确切的原因,但是sudo没有HOME正确抓取环境变量并使用了普通用户之一,因此它读取了.vimrc来自/home/user/.vimrc.

为了看到这一点,我发出:

user@hostname:~$ sudo bash
[sudo] password for user: 
root@hostname:/home/user# echo $HOME
/home/user
Run Code Online (Sandbox Code Playgroud)

其次,我在用户的 vimrc 文件中启用了折叠持久性以存储光标位置:

au BufWinLeave * mkview
au BufWinEnter * silent loadview
Run Code Online (Sandbox Code Playgroud)

这使得每次编辑文件时,都会在$HOME/.vim/view文件夹内创建一个属性文件。就我而言,看起来我没有sudo第一次尝试编辑文件,因此折叠文件是作为普通用户创建的:

user@hostname:~$ ll .vim/view/ | grep thunderbird.sh
-rw-rw-r-- 1 user user  2650 Aug 20 15:56 =+usr=+lib=+thunderbird=+thunderbird.sh=
Run Code Online (Sandbox Code Playgroud)

由于 root 取/home/useras $HOME,在我发出时(错误地)使用了相同的折叠文件sudo vim,由于某种原因我忽略了,可能与 vim 内部有关,如果折叠文件不归编辑用户所有,则打开编辑后的文件在只读模式下。

所以,我意识到如果我删除文件/home/user/.vim/view/=+usr=+lib=+thunderbird=+thunderbird.sh=然后尝试使用编辑sudo vim,我完全没有问题。

所以,在故事的结尾,为了解决这种情况,我刚刚编辑/etc/sudoers并添加了这一行:

Defaults always_set_home
Run Code Online (Sandbox Code Playgroud)

现在一切都按预期工作,我可以sudo再次可靠地使用。