我将一些库(libncurses,版本 5.9)从一台架构为 x86 的机器复制到另一台架构相同的机器。
尽管如此,运行时ldconfig
,我收到了权限拒绝消息:
bash-3.2# ldconfig
ldconfig: Cannot lstat /lib/libncursesw.so.5.9: Permission denied
ldconfig: Cannot lstat /lib/libncurses.so.5.9: Permission denied
注意:/lib
是 的符号链接/usr/lib
。
下面是这些库的列表(我加了一些 !!! 标记):
bash-3.2# ls -all /usr/lib | grep libncurses*
lrwxrwxrwx 1 root root 19 Nov 3 10:15 libncurses++.so.6 -> libncurses++.so.6.1
-rwxr-xr-x 1 root root 71696 Oct 23 22:27 libncurses++.so.6.1
lrwxrwxrwx 1 root root 20 Nov 3 10:15 libncurses++w.so.6 -> libncurses++w.so.6.1
-rwxr-xr-x 1 root root 71696 Oct 23 22:27 libncurses++w.so.6.1
lrwxrwxrwx 1 root root 17 Mar 17 15:01 libncurses.so.5 -> libncurses.so.5.9
-rwxr-xr-x 1 root root !!! 158528 Mar 17 14:56 libncurses.so.5.9
lrwxrwxrwx 1 root root 17 Nov 3 10:15 libncurses.so.6 -> libncurses.so.6.1
-rwxr-xr-x 1 root root 169780 Oct 23 22:27 libncurses.so.6.1
lrwxrwxrwx 1 root root 18 Mar 17 15:00 libncursesw.so.5 -> libncursesw.so.5.9
-rwxr-xr-x 1 root root !!! 225240 Mar 17 14:56 libncursesw.so.5.9
lrwxrwxrwx 1 root root 18 Nov 3 10:15 libncursesw.so.6 -> libncursesw.so.6.1
-rwxr-xr-x 1 root root 247700 Oct 23 22:27 libncursesw.so.6.1
您可以看到,我复制的5.9
版本具有与他们的完全相同的权限6.1
。
另外,我尝试将权限更改为777
,但没有帮助。
我怎样才能ldconfig
考虑到这些库?
这是一个基于 RedHat 的微型操作系统,默认情况下没有太多可用的命令。
@user1686 的评论很有帮助,复制的库确实不同:
现在,为了节省一些互联网空间:我怎样才能更改User::Shell
这些_
文件?(我发现了一些东西semanage
但是该命令不可用)。
答案1
这些文件的区别在于安全上下文它被几个强制访问控制系统使用——最常见的是 SELinux,但在你的情况下,它实际上看起来更像是啪。
安全上下文存储在扩展属性(xattrs)中,在 SMACK 的情况下,它只是一个可以使用attr
或getfattr
/进行更改的纯文本值setfattr
。
在 SMACK 中,_
“floor” 是用于公开可读数据的内置标签。但是,我不确定它是否存储为显式标签,或者在没有任何标签的情况下是否只是默认标签。因此,只需使用任何必要的方法,使“getfattr”输出在两者上看起来相同即可。
List: # getfattr -d -m - libncurses.so.5
Set: # setfattr -n security.SMACK64 -v _ libncurses*.so.5*
Remove: # setfattr -x security.SMACK64 libncurses*.so.5*
List: # attr -S -l libncurses.so.6.1
Get: # attr -S -g SMACK64 libncurses.so.5
Set: # attr -S -s SMACK64 -V _ libncurses.so.5
Remove: # attr -S -r SMACK64 libncurses.so.5
#include <sys/types.h>
#include <sys/xattr.h>
#include <err.h>
main(int argc, char *argv[]) {
for (int i=1; i<argc; i++)
if (setxattr(argv[i], "security.SMACK64", "_", sizeof("_"), 0))
warn("setxattr(%s) failed", argv[i]);
}
请注意,您必须具有 CAP_MAC_ADMIN 才能更改此属性。