我刚刚遇到了一个非常奇怪的情况。
我试图编辑 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*
我发现如果我发出
sudo vim /usr/lib/thunderbird/thunderbird.sh
当我切换到插入模式时,我收到一条警告消息:
/usr/lib/thunderbird/thunderbird.sh [RO]
W10: Warning: Changing a readonly file
-- INSERT --
而我实际上无法写出任何更改。
但是,如果我发出:
user@hostname:~$ sudo su -
root@hostname:~# vim /usr/lib/thunderbird/thunderbird.sh
我可以毫无问题地编辑该文件。
奇怪的是,我编辑了许多具有类似权限的文件,例如 中的配置文件/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
这是我的 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
我的用户在 sudo 组内。
知道为什么会发生这种情况吗?
答案1
我刚刚发现原因,是以下几种情况的集合:
首先,我不知道为什么,但sudo
没有HOME
正确获取环境变量并使用普通用户的环境变量,所以它读取.vimrc
了/home/user/.vimrc.
为了看到这一点,我发布了:
user@hostname:~$ sudo bash
[sudo] password for user:
root@hostname:/home/user# echo $HOME
/home/user
其次,我在用户的 vimrc 文件中启用了折叠持久性,以便存储光标位置:
au BufWinLeave * mkview
au BufWinEnter * silent loadview
这使得每次编辑文件时,都会在$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=
由于 root 为/home/user
,所以$HOME
当我发出 时,(错误地)使用了相同的折叠文件sudo vim
,并且出于某种我忽略的原因,可能与 vim 内部结构有关,如果折叠文件不属于编辑用户所有,则编辑的文件将被打开在只读模式下。
所以,我意识到,如果我删除该文件/home/user/.vim/view/=+usr=+lib=+thunderbird=+thunderbird.sh=
,然后尝试使用它进行编辑,sudo vim,
则完全没有问题。
因此,在故事的结尾,为了解决这种情况,我刚刚编辑/etc/sudoers
并添加了这一行:
Defaults always_set_home
现在一切都按预期进行,我可以sudo
再次可靠地使用。
答案2
我用这个命令解决了这个问题:
sudo chattr -i filename