使用 sudo 调用时,vim 的双符号链接不会加载库文件 ncurses.so.6

使用 sudo 调用时,vim 的双符号链接不会加载库文件 ncurses.so.6

我有 vim.basic 可执行文件的符号链接:

⤷ ls -l /etc/alternatives/vim
lrwxrwxrwx 1 root root 18 Apr 22 21:02 /etc/alternatives/vim -> /usr/bin/vim.basic

上述符号链接的另一个符号链接为:

⤷ ls -l /usr/bin/vim         
lrwxrwxrwx 1 root root 21 Apr 22 21:02 /usr/bin/vim -> /etc/alternatives/vim

它们的系统配置符合我对更新替代方案的期望,除了有时从 linux 内核 5.4 启动或通常从 4.15 使用相同的 root 和 home 分区启动之外,我没有更改任何内容,这可能是什么导致了使用 sudo 运行 vim 时出现问题? :

⤷ sudo vim.basic                #This works fine!
⤷ sudo /etc/alternatives/vim    #This works fine!
⤷ sudo vim      
vim: error while loading shared libraries: libncurses.so.6: cannot open shared object file: No such file or directory

libncurses.so 安装在 LD_LIBRARY_PATH 指向的路径中:

⤷ echo $LD_LIBRARY_PATH
/home/akd/dotapps/local/lib:

⤷ ls -l /home/akd/dotapps/local/lib/libncurses.so.6
lrwxrwxrwx 1 akd akd 17 Nov  9 21:24 /home/akd/dotapps/local/lib/libncurses.so.6 -> libncurses.so.6.2

我似乎无法理解为什么双符号链接在 sudo vim 操作上找不到 libcurses.so.6 。没有 sudo 的普通 vim 二进制文件可以按预期工作(不抱怨 ncurses lib)。

⤷ vim --version
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Feb 16 2021 13:33:23)
⤷ sudo --version
Sudo version 1.8.21p2
Sudoers policy plugin version 1.8.21p2
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.21p2

知道为什么会有这种奇怪的行为吗?

更新:

根据要求添加更多信息:

⤷ ldd $(which vim)        
    linux-vdso.so.1 (0x00007ffc9a2a6000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9d5e059000)
    libncurses.so.6 => /home/akd/dotapps/local/lib/libncurses.so.6 (0x00007f9d5ddee000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9d5dbea000)
    libpython3.6m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 (0x00007f9d5d53f000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9d5d320000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9d5cf2f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9d5e909000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f9d5ccfd000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f9d5cae0000)
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f9d5c8dd000)

答案1

看起来您已经安装libncurses.soakb的主目录中,并通过添加到 使其export ENVIRONMENT=/home/akb/.../lib可用/home/akb/.bashrc

这都是特定于用户的。如果您以另一个用户 ( ) 的身份运行它sudo -u akc vim,您会遇到用户akc没有读取权限,/home/akb因此akc无法读取库的问题。环境也会刷新,因此您export所在的任何内容/home/akb/.bashrc都不会应用。

为了解决这个问题,您需要在libncurses.so系统范围内进行安装。推荐的选项是使用您的发行版附带的版本(示例):

sudo apt install libncurses6

但你有一个本地副本,我认为这是有原因的。在这种情况下,您需要在系统范围内安装它:

./configure
make
sudo make install DESTDIR=/usr/local

对你发布的vim. vim.basic8.2 在 debian 上不依赖于ncurses.如果您是从源代码构建/安装的,那么您很可能缺少此运行时依赖项。但如果您通过包安装,那么我希望您的包管理器自动安装所有配置的运行时依赖项。因此,这听起来像是./configure构建包时传递给的错误标志,或者缺少Depends:您应该通知包维护者的标志。

相关内容