在我之前的问题中,执行“chmod 666 ld-2.17.so” - 我该如何恢复?我问如果我更改ld-2.17.so
读取权限,我怎样才能恢复它,因为它不允许我执行任何需要这些库的操作?
我得到的答案如下:
如果您有一个可以写入的可执行文件,您可以使用 bash 的读取将 ld.so 的内容复制到该文件:
while IFS= read -d '' -r line; do printf "%s\0" "$line"; done > executable-file < /lib64/ld-2.17.so
我尝试了一下,并且成功了。但我感到困惑的是,while
如果这个循环/bin/bash
本身需要lib64/ld-2.17.so
库,为什么它会起作用,如下所示,
ldd /bin/bash
linux-vdso.so.1 => (0x00007ffc54dee000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f6fb9bbe000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6fb99ba000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6fb95f6000)
/lib64/ld-linux-x86-64.so.2 (0x000055ec142f5000)
有人可以告诉我为什么bash
代码可以在没有 的情况下从终端运行吗/lib64/ld-2.17.so
?这是否也意味着bash
即使/lib64/ld-2.17.so
没有权限,我也可以从终端使用创建一个空的可执行文件?
谢谢
答案1
while IFS= read -d '' -r line; do
printf "%s\0" "$line"
done > executable-file < /lib64/ld-2.17.so
仅使用 shell 内置函数,因此不需要启动新进程。恢复场景假设您已经有一个正在运行的 shell;因为它已经在运行,所以它在磁盘上的权限及其库的权限不再重要。
在这种情况下,您将无法启动新的 shell,但当前正在运行的任何内容都不会受到更改的权限的影响。
如果您尝试读取的文件有不权限,只有当您处于 root shell 中时这才有效;否则重定向ld-2.17.so
将会失败,因为除非您是 root,否则无法读取不可读的文件。 (我在这里忽略 SELinux 等。)